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>
16 /* OK, here's how this works. Each of the steps needed for install -
17 dialogs, downloads, installs - are in their own files and have some
18 "do_*" function (prototype in dialog.h) and a resource id (IDD_* or
19 IDD_S_* in resource.h) for that step. Each step is responsible for
20 selecting the next step! See the NEXT macro in dialog.h. Note
21 that the IDD_S_* ids are fake; those are for steps that don't
22 really have a controlling dialog (some have progress dialogs, but
23 those don't count, although they could). Replace the IDD_S_* with
24 IDD_* if you create a real dialog for those steps. */
27 static const char *cvsid
=
47 #include "propsheet.h"
60 #include "getopt++/GetOption.h"
67 /* Maximum size of a SID on NT/W2K. */
68 #define MAX_SID_LEN 40
70 /* Computes the size of an ACL in relation to the number of ACEs it
72 #define TOKEN_ACL_SIZE(cnt) (sizeof(ACL) + \
73 (cnt) * (sizeof(ACCESS_ALLOWED_ACE) + MAX_SID_LEN))
75 #define iswinnt (GetVersion() < 0x80000000)
80 /* To assure that the created files have a useful ACL, the
81 default DACL in the process token is set to full access to
82 everyone. This applies to files and subdirectories created
83 in directories which don't propagate permissions to child
86 /* Create a buffer which has enough room to contain the TOKEN_DEFAULT_DACL
87 structure plus an ACL with one ACE. */
88 char buf
[sizeof (TOKEN_DEFAULT_DACL
) + TOKEN_ACL_SIZE (1)];
90 /* First initialize the TOKEN_DEFAULT_DACL structure. */
91 PTOKEN_DEFAULT_DACL dacl
= (PTOKEN_DEFAULT_DACL
) buf
;
92 dacl
->DefaultDacl
= (PACL
) (buf
+ sizeof *dacl
);
94 /* Initialize the ACL for containing one ACE. */
95 if (!InitializeAcl (dacl
->DefaultDacl
, TOKEN_ACL_SIZE (1), ACL_REVISION
))
97 log (LOG_TIMESTAMP
, "InitializeAcl() failed: %lu", GetLastError ());
101 /* Get the SID for "Everyone". */
103 SID_IDENTIFIER_AUTHORITY sid_auth
= { SECURITY_WORLD_SID_AUTHORITY
};
104 if (!AllocateAndInitializeSid (&sid_auth
, 1, 0, 0, 0, 0, 0, 0, 0, 0, &sid
))
106 log (LOG_TIMESTAMP
, "AllocateAndInitializeSid() failed: %lu",
111 /* Create the ACE which grants full access to "Everyone" and store it
112 in dacl->DefaultDacl. */
113 if (!AddAccessAllowedAce
114 (dacl
->DefaultDacl
, ACL_REVISION
, GENERIC_ALL
, sid
))
116 log (LOG_TIMESTAMP
, "AddAccessAllowedAce() failed: %lu",
121 /* Get the processes access token. */
123 if (!OpenProcessToken (GetCurrentProcess (),
124 TOKEN_READ
| TOKEN_ADJUST_DEFAULT
, &token
))
126 log (LOG_TIMESTAMP
, "OpenProcessToken() failed: %lu", GetLastError ());
130 /* Set the default DACL to the above computed ACL. */
131 if (!SetTokenInformation (token
, TokenDefaultDacl
, dacl
, sizeof buf
))
132 log (LOG_TIMESTAMP
, "OpenProcessToken() failed: %lu", GetLastError ());
134 /* Close token handle. */
138 /* Free memory occupied by the "Everyone" SID. */
142 // Other threads talk to this page, so we need to have it externable.
143 ThreeBarProgressPage Progress
;
146 WinMain (HINSTANCE h
,
147 HINSTANCE hPrevInstance
, LPSTR command_line
, int cmd_show
)
151 next_dialog
= IDD_SPLASH
;
153 log (LOG_PLAIN
, String ("Starting cygwin install, version ") + version
);
158 LocalDirPage LocalDir
;
162 DesktopSetupPage Desktop
;
163 PropSheet MainWindow
;
166 GetCurrentDirectory (sizeof (cwd
), cwd
);
167 local_dir
= String (cwd
);
168 log (LOG_TIMESTAMP
, String ("Current Directory: ") + local_dir
);
172 for (argc
= 0, argv
= __argv
; *argv
; argv
++)++argc
;
174 if (!GetOption::GetInstance().Process (argc
, __argv
))
178 /* Set the default DACL only on NT/W2K. 9x/ME has no idea of access
179 control lists and security at all. */
183 // Initialize common controls
184 InitCommonControls ();
186 // Init window class lib
187 Window::SetAppInstance (h
);
200 // Add pages to sheet
201 MainWindow
.AddPage (&Splash
);
202 MainWindow
.AddPage (&Source
);
203 MainWindow
.AddPage (&Root
);
204 MainWindow
.AddPage (&LocalDir
);
205 MainWindow
.AddPage (&Net
);
206 MainWindow
.AddPage (&Site
);
207 MainWindow
.AddPage (&Chooser
);
208 MainWindow
.AddPage (&Progress
);
209 MainWindow
.AddPage (&Desktop
);
211 // Create the PropSheet main window
212 MainWindow
.Create ();
215 /* Keep gcc happy :} */