]> cygwin.com Git - cygwin-apps/setup.git/blobdiff - win32.h
Use solver to check for problems and produce a list of package transactions
[cygwin-apps/setup.git] / win32.h
diff --git a/win32.h b/win32.h
index 98d8e6a22065f96833e4656409b31fc8a62277d3..c866790df6d8a1046ebb702852309d82a33b5959 100644 (file)
--- a/win32.h
+++ b/win32.h
  *
  */
 
-/* The inital purpose of this file was limit the number of Win32 headers we
-   actually have to parse.  The Setup program only uses a few of them,
-   so there's no point in parsing them all (even lean-n-mean).  Doing
-   this cuts compile time in half. Now it's also the header for the Win32
-   class which provides runtime information about the OS
- */
-
 #ifndef SETUP_WIN32_H
 #define SETUP_WIN32_H
 
-#define NOCOMATTRIBUTE
+#include <sys/types.h>
+#include <string>
 
-#include <stdarg.h>
+/* Needed for some buffers etc., to have a useful replacement for MAX_PATH. */
+#define CYG_PATH_MAX   4096
 
+/* Any include of <windows.h> should be through this file, which wraps it in
+ * various other handling. */
+
+/* Basic Windows features only. */
 #define WIN32_LEAN_AND_MEAN
-/* We want a minimum IE version of 3 */
-#define _WIN32_IE 0x0300
+
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0a00
+
+/* libstdc++-v3 _really_ dislikes min & max defined as macros. */
+/* As of gcc 3.3.1, it defines NOMINMAX itself, so test first,
+ * to avoid a redefinition error */
+#ifndef NOMINMAX
+#define NOMINMAX
+#endif
+
+/* 100ns difference between Windows and UNIX timebase. */
+#define FACTOR (0x19db1ded53e8000LL)
+/* # of 100ns intervals per second. */
+#define NSPERSEC 10000000LL
+
+/* Defining WINBASEAPI is required due the overloading definitions of some
+   kernel32 functions in filemanip.cc. */
+#define WINBASEAPI
+
 #include <windows.h>
 
-#include <wininet.h>
-#include <windowsx.h>
+/* FIXME: The use of _access(fname, 0) as an existence check should be
+ * replaced with a more readable idiom, and this fragment removed. */
+#ifndef _access
+#define _access access
+#endif
 
-/* =========================== */
-#ifdef __cplusplus
-class Win32 {
+/* When we have to check for a path delimiter, check for both, slash and
+   backslash. */
+#define isdirsep(ch) \
+    ({ \
+       char __c = (ch); \
+       ((__c) == '/' || (__c) == '\\'); \
+    })
+
+/* Maximum size of a SID. */
+#define MAX_SID_LEN    40
+
+/* Computes the size of an ACL in relation to the number of ACEs it
+   should contain. */
+#define TOKEN_ACL_SIZE(cnt) (sizeof (ACL) + \
+                            (cnt) * (sizeof (ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
+
+struct acl_t {
+  /* Make sure &acl is 4-byte aligned. */
+  ACL acl __attribute__ ((aligned (4)));
+  char aclbuf[TOKEN_ACL_SIZE (7)];
+};
+
+class SIDWrapper {
   public:
-    enum _os {
-      Win9x,
-      WinNT
-    };
-  static enum _os OS ();
+    SIDWrapper () : value (NULL) {}
+    /* Prevent synthetics. If assignment is needed, this should be
+       refcounting.  */
+    SIDWrapper (SIDWrapper const &);
+    SIDWrapper& operator= (SIDWrapper const &);
+    ~SIDWrapper () { if (value) FreeSid (value); }
+
+    /* We could look at doing weird typcast overloads here,
+       but manual access is easier for now.  */
+    PSID &theSID () { return value; }
+    PSID const &theSID () const { return value; }
+  private:
+    PSID value;
 };
 
-#endif //_cplusplus
-#endif // SETUP_WIN32_H
+class HANDLEWrapper {
+  public:
+    HANDLEWrapper () : value (NULL) {}
+    /* Prevent synthetics. If assignment is needed, we should duphandles,
+       or refcount.  */
+    HANDLEWrapper (HANDLEWrapper const &);
+    HANDLEWrapper& operator= (HANDLEWrapper const &);
+    ~HANDLEWrapper () { if (value) CloseHandle (value); }
+    HANDLE &theHANDLE () { return value; }
+    HANDLE const &theHANDLE () const { return value; }
+  private:
+    HANDLE value;
+};
+
+class NTSecurity
+{
+public:
+  NTSecurity () : nullSID (), everyOneSID (), administratorsSID (), usersSID (),
+                 cr_ownerSID (), cr_groupSID (), groupSID (NULL),
+                 _wellKnownSIDsinitialized (false), token () {}
+  ~NTSecurity() {}
+
+  /* prevent synthetics */
+  NTSecurity& operator= (NTSecurity const &);
+  NTSecurity (NTSecurity const &);
+
+  /* Set POSIX-like permissions on files.  The fname is only used for printing
+     log output.  The function requires an open HANDLE with sufficient
+     permissions (READ_DAC | WRITE_DAC). */
+  PSECURITY_DESCRIPTOR GetPosixPerms (const char *fname, PSID owner_sid,
+                                     PSID group_sid, mode_t mode,
+                                     SECURITY_DESCRIPTOR &out_sd, acl_t &acl);
+  void resetPrimaryGroup();
+  void setAdminGroup ();
+  void initialiseWellKnownSIDs ();
+  void setDefaultSecurity();
+  bool isRunAsAdmin ();
+private:
+  void NoteFailedAPI (const std::string &);
+  bool wellKnownSIDsinitialized () const { return _wellKnownSIDsinitialized; }
+  void wellKnownSIDsinitialized (bool b) { _wellKnownSIDsinitialized = b; }
+  void setDefaultDACL ();
+  void setBackupPrivileges ();
+
+  SIDWrapper nullSID, everyOneSID, administratorsSID, usersSID,
+            cr_ownerSID, cr_groupSID;
+  struct {
+    TOKEN_USER user;
+    char buf[MAX_SID_LEN];
+  } ownerSID;
+  PSID groupSID;
+  struct {
+    TOKEN_PRIMARY_GROUP pgrp;
+    char buf[MAX_SID_LEN];
+  } primaryGroupSID;
+
+  bool _wellKnownSIDsinitialized;
+  HANDLEWrapper token;
+  DWORD size;
+};
+
+extern NTSecurity nt_sec;
+
+#undef major
+#undef minor
+class VersionInfo
+{
+  public:
+     VersionInfo ();
+     DWORD major () const { return v.dwMajorVersion; }
+     DWORD minor () const { return v.dwMinorVersion; }
+     DWORD buildNumber () const { return v.dwBuildNumber; }
+  private:
+     OSVERSIONINFO v;
+};
+
+VersionInfo& GetVer ();
+
+#define OSMajorVersion() (GetVer ().major ())
+#define OSMinorVersion() (GetVer ().minor ())
+#define OSBuildNumber() (GetVer ().buildNumber ())
+
+static inline void
+GetDlgItemRect (HWND h, int item, LPRECT r)
+{
+  GetWindowRect (GetDlgItem (h, item), r);
+  MapWindowPoints (HWND_DESKTOP, h, (LPPOINT) r, 2);
+}
+
+static inline void
+SetDlgItemRect (HWND h, int item, LPRECT r)
+{
+  MoveWindow (GetDlgItem (h, item), r->left, r->top,
+             r->right - r->left, r->bottom - r->top, TRUE);
+}
+
+#endif /* SETUP_WIN32_H */
This page took 0.025767 seconds and 5 git commands to generate.