2 * Copyright (c) 2000, Red Hat, Inc.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * A copy of the GNU General Public License can be found at
12 * Written by DJ Delorie <dj@cygnus.com>
13 * and Robert Collins <rbtcollins@hotmail.com>
22 /* Any include of <windows.h> should be through this file, which wraps it in
23 * various other handling. */
25 /* Basic Windows features only. */
26 #define WIN32_LEAN_AND_MEAN
28 /* libstdc++-v3 _really_ dislikes min & max defined as macros. */
29 /* As of gcc 3.3.1, it defines NOMINMAX itself, so test first,
30 * to avoid a redefinition error */
35 /* In w32api 3.1, __declspec(dllimport) decoration is added to
36 * certain symbols. This breaks our autoload mechanism - the symptom is
37 * multiple declaration errors at link time. This define turns that off again.
38 * It will default to off again in later w32api versions, but we need to work
39 * with 3.1 for now. */
42 /* Require at least Internet Explorer 3, in order to have access to
43 * sufficient Windows Common Controls features from <commctrl.h> . */
44 #define _WIN32_IE 0x0300
48 /* FIXME: The use of _access(fname, 0) as an existence check should be
49 * replaced with a more readable idiom, and this fragment removed. */
51 #define _access access
54 /* Maximum size of a SID on NT/W2K. */
55 #define MAX_SID_LEN 40
57 /* Computes the size of an ACL in relation to the number of ACEs it
59 #define TOKEN_ACL_SIZE(cnt) (sizeof (ACL) + \
60 (cnt) * (sizeof (ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
64 char aclbuf
[TOKEN_ACL_SIZE (7)];
69 SIDWrapper () : value (NULL
) {}
70 /* Prevent synthetics. If assignment is needed, this should be
72 SIDWrapper (SIDWrapper
const &);
73 SIDWrapper
& operator= (SIDWrapper
const &);
74 ~SIDWrapper () { if (value
) FreeSid (value
); }
76 /* We could look at doing weird typcast overloads here,
77 but manual access is easier for now. */
78 PSID
&theSID () { return value
; }
79 PSID
const &theSID () const { return value
; }
86 HANDLEWrapper () : value (NULL
) {}
87 /* Prevent synthetics. If assignment is needed, we should duphandles,
89 HANDLEWrapper (HANDLEWrapper
const &);
90 HANDLEWrapper
& operator= (HANDLEWrapper
const &);
91 ~HANDLEWrapper () { if (value
) CloseHandle (value
); }
92 HANDLE
&theHANDLE () { return value
; }
93 HANDLE
const &theHANDLE () const { return value
; }
101 NTSecurity () : nullSID (), everyOneSID (), administratorsSID (), usersSID (),
102 cr_ownerSID (), cr_groupSID (), groupSID (NULL
),
103 _wellKnownSIDsinitialized (false), token () {}
106 /* prevent synthetics */
107 NTSecurity
& operator= (NTSecurity
const &);
108 NTSecurity (NTSecurity
const &);
110 /* Set POSIX-like permissions on files. The fname is only used for printing
111 log output. The function requires an open HANDLE with sufficient
112 permissions (READ_DAC | WRITE_DAC). */
113 PSECURITY_DESCRIPTOR
GetPosixPerms (const char *fname
, PSID owner_sid
,
114 PSID group_sid
, mode_t mode
,
115 SECURITY_DESCRIPTOR
&out_sd
, acl_t
&acl
);
116 void SetPosixPerms (const char *fname
, HANDLE fh
, mode_t mode
);
117 void resetPrimaryGroup();
118 void setAdminGroup ();
119 void setDefaultSecurity();
121 void NoteFailedAPI (const std::string
&);
122 bool wellKnownSIDsinitialized () const { return _wellKnownSIDsinitialized
; }
123 void wellKnownSIDsinitialized (bool b
) { _wellKnownSIDsinitialized
= b
; }
124 void initialiseWellKnownSIDs ();
125 void setDefaultDACL ();
126 void setBackupPrivileges ();
128 SIDWrapper nullSID
, everyOneSID
, administratorsSID
, usersSID
,
129 cr_ownerSID
, cr_groupSID
;
132 char buf
[MAX_SID_LEN
];
136 TOKEN_PRIMARY_GROUP pgrp
;
137 char buf
[MAX_SID_LEN
];
140 bool _wellKnownSIDsinitialized
;
145 extern NTSecurity nt_sec
;
153 bool isNT () { return (v
.dwPlatformId
== VER_PLATFORM_WIN32_NT
); }
154 DWORD
major () const { return v
.dwMajorVersion
; }
155 DWORD
minor () const { return v
.dwMinorVersion
; }
160 VersionInfo
& GetVer ();
162 #define IsWindowsNT() (GetVer ().isNT ())
163 #define OSMajorVersion() (GetVer ().major ())
164 #define OSMinorVersion() (GetVer ().minor ())
166 #endif /* SETUP_WIN32_H */