Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

578 lines
14 KiB

  1. /*++
  2. Copyright (c) 2000 Microsoft Corporation
  3. Module Name:
  4. sgminit.c
  5. Abstract:
  6. Implements the initialization/termination code for the data gather portion
  7. of scanstate v1 compatiblity.
  8. Author:
  9. Jim Schmidt (jimschm) 12-Mar-2000
  10. Revision History:
  11. <alias> <date> <comments>
  12. --*/
  13. //
  14. // Includes
  15. //
  16. #include "pch.h"
  17. #include "v1p.h"
  18. #define DBG_V1 "v1"
  19. //
  20. // Strings
  21. //
  22. // None
  23. //
  24. // Constants
  25. //
  26. // None
  27. //
  28. // Macros
  29. //
  30. // None
  31. //
  32. // Types
  33. //
  34. // None
  35. //
  36. // Globals
  37. //
  38. PMAPSTRUCT g_EnvMap;
  39. PMAPSTRUCT g_UndefMap;
  40. PMAPSTRUCT g_RevEnvMap;
  41. HASHTABLE g_RenameSrcTable;
  42. HASHTABLE g_RenameDestTable;
  43. HASHTABLE g_DePersistTable;
  44. PMHANDLE g_V1Pool;
  45. MIG_OBJECTTYPEID g_FileType;
  46. MIG_OBJECTTYPEID g_RegType;
  47. MIG_OBJECTTYPEID g_IniType;
  48. MIG_ATTRIBUTEID g_OsFileAttribute;
  49. MIG_ATTRIBUTEID g_CopyIfRelevantAttr;
  50. MIG_ATTRIBUTEID g_LockPartitionAttr;
  51. //
  52. // Macro expansion list
  53. //
  54. //
  55. // Private function prototypes
  56. //
  57. VCMINITIALIZE ScriptVcmInitialize;
  58. SGMINITIALIZE ScriptSgmInitialize;
  59. BOOL
  60. pParseAllInfs (
  61. VOID
  62. );
  63. //
  64. // Macro expansion definition
  65. //
  66. // None
  67. //
  68. // Code
  69. //
  70. VOID
  71. pPrepareIsmEnvironment (
  72. VOID
  73. )
  74. {
  75. if (IsmGetRealPlatform() == PLATFORM_SOURCE) {
  76. SetIsmEnvironmentFromPhysicalMachine (g_EnvMap, FALSE, g_UndefMap);
  77. } else {
  78. // next call is just to set destination ISM environment with some of the CSIDL env variables
  79. SetIsmEnvironmentFromPhysicalMachine (NULL, FALSE, NULL);
  80. SetIsmEnvironmentFromVirtualMachine (g_EnvMap, g_RevEnvMap, g_UndefMap);
  81. }
  82. }
  83. BOOL
  84. pInitGlobals (
  85. IN PMIG_LOGCALLBACK LogCallback
  86. )
  87. {
  88. BOOL result;
  89. LogReInit (NULL, NULL, NULL, (PLOGCALLBACK) LogCallback);
  90. g_V1Pool = PmCreateNamedPool ("v1 sgm");
  91. g_EnvMap = CreateStringMapping();
  92. g_UndefMap = CreateStringMapping();
  93. g_RevEnvMap = CreateStringMapping();
  94. g_FileType = MIG_FILE_TYPE;
  95. g_RegType = MIG_REGISTRY_TYPE;
  96. g_IniType = MIG_INI_TYPE;
  97. result = g_V1Pool && g_EnvMap && g_UndefMap && g_RevEnvMap;
  98. if (!result) {
  99. DEBUGMSG ((DBG_ERROR, "Unable to initialize gather module globals"));\
  100. }
  101. return result;
  102. }
  103. BOOL
  104. pCommonInit (
  105. IN PVOID Reserved,
  106. IN BOOL VcmMode
  107. )
  108. {
  109. g_OsFileAttribute = IsmRegisterAttribute (S_ATTRIBUTE_OSFILE, FALSE);
  110. g_CopyIfRelevantAttr = IsmRegisterAttribute (S_ATTRIBUTE_COPYIFRELEVANT, FALSE);
  111. g_LockPartitionAttr = IsmRegisterAttribute (S_ATTRIBUTE_PARTITIONLOCK, FALSE);
  112. g_DePersistTable = HtAlloc ();
  113. InitRules();
  114. //
  115. // Call special conversion entry point
  116. //
  117. InitSpecialConversion (PLATFORM_SOURCE);
  118. InitSpecialRename (PLATFORM_SOURCE);
  119. //
  120. // Save shell folder environment
  121. //
  122. pPrepareIsmEnvironment();
  123. return TRUE;
  124. }
  125. BOOL
  126. pGetDomainUserName (
  127. OUT PCTSTR *Domain,
  128. OUT PCTSTR *User
  129. )
  130. {
  131. TCHAR userName[256];
  132. TCHAR domainName[256];
  133. DWORD size;
  134. HANDLE token = NULL;
  135. BOOL b;
  136. PTOKEN_USER tokenInfo = NULL;
  137. BOOL result = FALSE;
  138. DWORD domainSize;
  139. SID_NAME_USE dontCare;
  140. MIG_OBJECTSTRINGHANDLE regObject;
  141. MIG_CONTENT regContent;
  142. *Domain = NULL;
  143. *User = NULL;
  144. //
  145. // Assert that this is the source platform. We access the system directly.
  146. //
  147. MYASSERT (IsmGetRealPlatform() == PLATFORM_SOURCE);
  148. __try {
  149. if (ISWIN9X()) {
  150. size = ARRAYSIZE(userName);
  151. if (!GetUserName (userName, &size)) {
  152. LOG ((LOG_WARNING, (PCSTR) MSG_CANT_GET_USERNAME));
  153. __leave;
  154. }
  155. *User = DuplicateText (userName);
  156. regObject = IsmCreateObjectHandle (
  157. TEXT("HKLM\\System\\CurrentControlSet\\Services\\MSNP32\\NetworkProvider"),
  158. TEXT("AuthenticatingAgent")
  159. );
  160. if (IsmAcquireObject (g_RegType, regObject, &regContent)) {
  161. if (!regContent.ContentInFile &&
  162. regContent.MemoryContent.ContentBytes &&
  163. regContent.Details.DetailsSize == sizeof (DWORD) &&
  164. *((PDWORD) regContent.Details.DetailsData) == REG_SZ
  165. ) {
  166. *Domain = DuplicateText ((PCTSTR) regContent.MemoryContent.ContentBytes);
  167. }
  168. IsmReleaseObject (&regContent);
  169. }
  170. IsmDestroyObjectHandle (regObject);
  171. } else {
  172. if (!OpenProcessToken (GetCurrentProcess(), TOKEN_QUERY, &token)) {
  173. LOG ((LOG_WARNING, (PCSTR) MSG_PROCESS_TOKEN_ERROR));
  174. __leave;
  175. }
  176. size = 0;
  177. GetTokenInformation (
  178. token,
  179. TokenUser, // sdk enum value
  180. NULL,
  181. 0,
  182. &size
  183. );
  184. if (size) {
  185. tokenInfo = (PTOKEN_USER) MemAllocUninit (size);
  186. b = GetTokenInformation (
  187. token,
  188. TokenUser,
  189. tokenInfo,
  190. size,
  191. &size
  192. );
  193. } else {
  194. b = FALSE;
  195. }
  196. if (!b) {
  197. LOG ((LOG_WARNING, (PCSTR) MSG_PROCESS_TOKEN_INFO_ERROR));
  198. __leave;
  199. }
  200. size = ARRAYSIZE (userName);
  201. domainSize = ARRAYSIZE (domainName);
  202. b = LookupAccountSid (
  203. NULL,
  204. tokenInfo->User.Sid,
  205. userName,
  206. &size,
  207. domainName,
  208. &domainSize,
  209. &dontCare
  210. );
  211. if (!b) {
  212. LOG ((LOG_WARNING, (PCSTR) MSG_SECURITY_ID_LOOKUP_ERROR));
  213. __leave;
  214. }
  215. *User = DuplicateText (userName);
  216. if (*domainName) {
  217. *Domain = DuplicateText (domainName);
  218. }
  219. }
  220. result = TRUE;
  221. }
  222. __finally {
  223. if (tokenInfo) {
  224. FreeAlloc (tokenInfo);
  225. }
  226. if (token) {
  227. CloseHandle (token);
  228. }
  229. }
  230. return result;
  231. }
  232. BOOL
  233. WINAPI
  234. ScriptSgmInitialize (
  235. IN PMIG_LOGCALLBACK LogCallback,
  236. IN PVOID Reserved
  237. )
  238. {
  239. TCHAR userName[256];
  240. TCHAR domainName[256];
  241. PCTSTR srcUserName;
  242. PCTSTR srcDomainName;
  243. if (!pInitGlobals (LogCallback)) {
  244. return FALSE;
  245. }
  246. g_RenameSrcTable = HtAllocWithData (sizeof (MIG_DATAHANDLE));
  247. g_RenameDestTable = HtAllocWithData (sizeof (MIG_DATAHANDLE));
  248. if (IsmGetRealPlatform() == PLATFORM_DESTINATION) {
  249. IsmGetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, userName, sizeof (userName));
  250. if (!IsmGetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, domainName, sizeof (domainName))) {
  251. if (IsmIsEnvironmentFlagSet (PLATFORM_DESTINATION, NULL, S_REQUIRE_DOMAIN_USER)) {
  252. //
  253. // NOTE: We could create the user account for the non-domain case.
  254. //
  255. IsmSetCancel();
  256. SetLastError (ERROR_INVALID_DOMAINNAME);
  257. LOG ((LOG_ERROR, (PCSTR) MSG_DOMAIN_REQUIRED));
  258. return FALSE;
  259. }
  260. } else {
  261. IsmSetEnvironmentString (
  262. PLATFORM_SOURCE,
  263. S_SYSENVVAR_GROUP,
  264. TEXT("USERDOMAIN"),
  265. domainName
  266. );
  267. AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), domainName);
  268. }
  269. IsmSetEnvironmentString (
  270. PLATFORM_SOURCE,
  271. S_SYSENVVAR_GROUP,
  272. TEXT("USERNAME"),
  273. userName
  274. );
  275. AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), userName);
  276. } else {
  277. if (!pGetDomainUserName (&srcDomainName, &srcUserName)) {
  278. if (IsmIsEnvironmentFlagSet (PLATFORM_DESTINATION, NULL, S_REQUIRE_DOMAIN_USER)) {
  279. return FALSE;
  280. }
  281. } else {
  282. IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, srcUserName);
  283. IsmSetEnvironmentString (
  284. PLATFORM_SOURCE,
  285. S_SYSENVVAR_GROUP,
  286. TEXT("USERNAME"),
  287. srcUserName
  288. );
  289. AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), srcUserName);
  290. if (srcDomainName) {
  291. IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, srcDomainName);
  292. IsmSetEnvironmentString (
  293. PLATFORM_SOURCE,
  294. S_SYSENVVAR_GROUP,
  295. TEXT("USERDOMAIN"),
  296. srcDomainName
  297. );
  298. AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), srcDomainName);
  299. }
  300. FreeText (srcUserName);
  301. FreeText (srcDomainName);
  302. }
  303. }
  304. //
  305. // Parse the script and do the rest of the business
  306. //
  307. return pCommonInit (Reserved, FALSE);
  308. }
  309. VOID
  310. pSaveRegDword (
  311. IN PCTSTR InfKeyName,
  312. IN PCTSTR Key,
  313. IN PCTSTR Value
  314. )
  315. {
  316. TCHAR buffer[32];
  317. MIG_OBJECTSTRINGHANDLE regObject;
  318. MIG_CONTENT regContent;
  319. regObject = IsmCreateObjectHandle (Key, Value);
  320. if (IsmAcquireObject (g_RegType, regObject, &regContent)) {
  321. if (!regContent.ContentInFile &&
  322. regContent.MemoryContent.ContentBytes &&
  323. regContent.Details.DetailsSize == sizeof (DWORD) &&
  324. *((PDWORD) regContent.Details.DetailsData) == REG_DWORD
  325. ) {
  326. wsprintf (buffer, TEXT("0x%08X"), *((PDWORD) regContent.MemoryContent.ContentBytes));
  327. IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, InfKeyName, buffer);
  328. }
  329. IsmReleaseObject (&regContent);
  330. }
  331. IsmDestroyObjectHandle (regObject);
  332. }
  333. VOID
  334. pSaveRegSz (
  335. IN PCTSTR InfKeyName,
  336. IN PCTSTR Key,
  337. IN PCTSTR Value
  338. )
  339. {
  340. MIG_OBJECTSTRINGHANDLE regObject;
  341. MIG_CONTENT regContent;
  342. regObject = IsmCreateObjectHandle (Key, Value);
  343. if (IsmAcquireObject (g_RegType, regObject, &regContent)) {
  344. if (!regContent.ContentInFile &&
  345. regContent.MemoryContent.ContentBytes &&
  346. regContent.Details.DetailsSize == sizeof (DWORD) &&
  347. *((PDWORD) regContent.Details.DetailsData) == REG_SZ
  348. ) {
  349. IsmSetTransportVariable (
  350. PLATFORM_SOURCE,
  351. S_SOURCE_MACHINE_SECTION,
  352. InfKeyName,
  353. (PCTSTR) regContent.MemoryContent.ContentBytes
  354. );
  355. }
  356. IsmReleaseObject (&regContent);
  357. }
  358. IsmDestroyObjectHandle (regObject);
  359. }
  360. BOOL
  361. WINAPI
  362. ScriptVcmInitialize (
  363. IN PMIG_LOGCALLBACK LogCallback,
  364. IN PVOID Reserved
  365. )
  366. {
  367. TCHAR buffer[256];
  368. DWORD d;
  369. PCTSTR domainName;
  370. PCTSTR userName;
  371. if (!pInitGlobals (LogCallback)) {
  372. return FALSE;
  373. }
  374. //
  375. // Save all the basic settings via the transport string interface
  376. //
  377. // version
  378. d = GetVersion();
  379. wsprintf (buffer, TEXT("0x%08x"), d);
  380. IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, S_VERSION_INFKEY, buffer);
  381. // code page
  382. d = (DWORD) GetACP();
  383. wsprintf (buffer, TEXT("0x%08x"), d);
  384. IsmSetTransportVariable (PLATFORM_SOURCE, S_SOURCE_MACHINE_SECTION, S_ACP_INFKEY, buffer);
  385. //
  386. // MACRO EXPANSION LIST -- generate the code necessary to save the settings
  387. // described in the macro expansion list in v1p.h
  388. //
  389. #define DEFMAC(infname,key,value) pSaveRegDword(TEXT(infname),TEXT(key),TEXT(value));
  390. STANDARD_DWORD_SETTINGS
  391. #undef DEFMAC
  392. #define DEFMAC(infname,key,value) pSaveRegSz(TEXT(infname),TEXT(key),TEXT(value));
  393. STANDARD_STRING_SETTINGS
  394. if (ISWIN9X()) {
  395. STANDARD_STRING_SETTINGS_9X
  396. } else {
  397. STANDARD_STRING_SETTINGS_NT
  398. }
  399. #undef DEFMAC
  400. //
  401. // Save the current user
  402. //
  403. if (!pGetDomainUserName (&domainName, &userName)) {
  404. return FALSE;
  405. }
  406. IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_USER_INFKEY, userName);
  407. IsmSetEnvironmentString (
  408. PLATFORM_SOURCE,
  409. S_SYSENVVAR_GROUP,
  410. TEXT("USERNAME"),
  411. userName
  412. );
  413. AddStringMappingPair (g_EnvMap, TEXT("%USERNAME%"), userName);
  414. if (domainName) {
  415. IsmSetTransportVariable (PLATFORM_SOURCE, S_USER_SECTION, S_DOMAIN_INFKEY, domainName);
  416. IsmSetEnvironmentString (
  417. PLATFORM_SOURCE,
  418. S_SYSENVVAR_GROUP,
  419. TEXT("USERDOMAIN"),
  420. domainName
  421. );
  422. AddStringMappingPair (g_EnvMap, TEXT("%DOMAINNAME%"), domainName);
  423. }
  424. FreeText (userName);
  425. FreeText (domainName);
  426. //
  427. // Parse the script and do the rest of the business
  428. //
  429. return pCommonInit (Reserved, TRUE);
  430. }
  431. VOID
  432. WINAPI
  433. ScriptTerminate (
  434. VOID
  435. )
  436. {
  437. HtFree (g_RenameSrcTable);
  438. g_RenameSrcTable = NULL;
  439. HtFree (g_RenameDestTable);
  440. g_RenameDestTable = NULL;
  441. HtFree (g_DePersistTable);
  442. g_DePersistTable = NULL;
  443. TerminateRestoreCallback ();
  444. TerminateSpecialRename();
  445. TerminateSpecialConversion();
  446. TerminateRules();
  447. }