JwaUserEnv.pas
上传用户:davidchvip
上传日期:2009-07-28
资源大小:1749k
文件大小:78k
源码类别:

Windows编程

开发平台:

Delphi

  1. {******************************************************************************}
  2. {                                                                       }
  3. { User Profile API interface Unit for Object Pascal                            }
  4. {                                                                       }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
  6. { Corporation. All Rights Reserved.                                            }
  7. {                 }
  8. { The original file is: userenv.h, released June 2000. The original Pascal     }
  9. { code is: UserEnv.pas, released December 2000. The initial developer of the   }
  10. { Pascal code is Marcel van Brakel (brakelm@chello.nl).                        }
  11. {                                                                              }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
  13. { Marcel van Brakel. All Rights Reserved.                                      }
  14. {                 }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
  16. {                }
  17. { You may retrieve the latest version of this file at the Project JEDI home    }
  18. { page, located at http://delphi-jedi.org or my personal homepage located at   }
  19. { http://members.chello.nl/m.vanbrakel2                                        }
  20. {                }
  21. { The contents of this file are used with permission, subject to the Mozilla   }
  22. { Public License Version 1.1 (the "License"); you may not use this file except }
  23. { in compliance with the License. You may obtain a copy of the License at      }
  24. { http://www.mozilla.org/MPL/MPL-1.1.html                                      }
  25. {                                                                              }
  26. { Software distributed under the License is distributed on an "AS IS" basis,   }
  27. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  28. { the specific language governing rights and limitations under the License.    }
  29. {                                                                              }
  30. { Alternatively, the contents of this file may be used under the terms of the  }
  31. { GNU Lesser General Public License (the  "LGPL License"), in which case the   }
  32. { provisions of the LGPL License are applicable instead of those above.        }
  33. { If you wish to allow use of your version of this file only under the terms   }
  34. { of the LGPL License and not to allow others to use your version of this file }
  35. { under the MPL, indicate your decision by deleting  the provisions above and  }
  36. { replace  them with the notice and other provisions required by the LGPL      }
  37. { License.  If you do not delete the provisions above, a recipient may use     }
  38. { your version of this file under either the MPL or the LGPL License.          }
  39. {                 }
  40. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  41. {                 }
  42. {******************************************************************************}
  43. unit JwaUserEnv;
  44. {$WEAKPACKAGEUNIT}
  45. {$HPPEMIT ''}
  46. {$HPPEMIT '#include "userenv.h"'}
  47. {$HPPEMIT ''}
  48. {$HPPEMIT 'typedef PGROUP_POLICY_OBJECTA *PPGROUP_POLICY_OBJECTA'}
  49. {$HPPEMIT 'typedef PGROUP_POLICY_OBJECTW *PPGROUP_POLICY_OBJECTW'}
  50. {$HPPEMIT ''}
  51. {$HPPEMIT 'typedef #ifdef UNICODE'}
  52. {$HPPEMIT 'typedef PPGROUP_POLICY_OBJECTW PPGROUP_POLICY_OBJECT'}
  53. {$HPPEMIT 'typedef #else'}
  54. {$HPPEMIT 'typedef PPGROUP_POLICY_OBJECTA PPGROUP_POLICY_OBJECT'}
  55. {$HPPEMIT 'typedef #endif'}
  56. {$HPPEMIT ''}
  57. {$I WINDEFINES.INC}
  58. interface
  59. uses
  60.   JwaProfInfo, {WbemCli, }JwaWinType, JWaWinBase, JwaWinNT;
  61. { TODO Convert WbemCli.h => Import TypeLibrary? }
  62. type
  63.   IWbemServices = Pointer;
  64.   IWbemClassObject = Pointer;
  65.   PSafeArray = Pointer;
  66. { /TODO }
  67. //=============================================================================
  68. //
  69. // LoadUserProfile
  70. //
  71. // Loads the specified user's profile.
  72. //
  73. // Most applications should not need to use this function.  It's used
  74. // when a user has logged onto the system or a service starts in a named
  75. // user account.
  76. //
  77. // hToken        - Token for the user, returned from LogonUser()
  78. // lpProfileInfo - Address of a PROFILEINFO structure
  79. //
  80. // Returns:  TRUE if successful
  81. //           FALSE if not.  Call GetLastError() for more details
  82. //
  83. // Note:  The caller of this function must have admin privileges on the machine.
  84. //
  85. //        Upon successful return, the hProfile member of the PROFILEINFO
  86. //        structure is a registry key handle opened to the root
  87. //        of the user's hive.  It has been opened with full access. If
  88. //        you need to read or write to the user's registry file, use
  89. //        this key instead of HKEY_CURRENT_USER.  Do not close this
  90. //        handle.  Instead pass it to UnloadUserProfile to close
  91. //        the handle.
  92. //
  93. //=============================================================================
  94. //
  95. // Flags that can be set in the dwFlags field
  96. //
  97. const
  98.   PI_NOUI        = $00000001; // Prevents displaying of messages
  99.   {$EXTERNALSYM PI_NOUI}
  100.   PI_APPLYPOLICY = $00000002; // Apply NT4 style policy
  101.   {$EXTERNALSYM PI_APPLYPOLICY}
  102. function LoadUserProfileA(hToken: HANDLE; var lpProfileInfo: PROFILEINFOA): BOOL; stdcall;
  103. {$EXTERNALSYM LoadUserProfileA}
  104. function LoadUserProfileW(hToken: HANDLE; var lpProfileInfo: PROFILEINFOW): BOOL; stdcall;
  105. {$EXTERNALSYM LoadUserProfileW}
  106. {$IFDEF UNICODE}
  107. function LoadUserProfile(hToken: HANDLE; var lpProfileInfo: PROFILEINFO): BOOL; stdcall;
  108. {$EXTERNALSYM LoadUserProfile}
  109. {$ELSE}
  110. function LoadUserProfile(hToken: HANDLE; var lpProfileInfo: PROFILEINFO): BOOL; stdcall;
  111. {$EXTERNALSYM LoadUserProfile}
  112. {$ENDIF}
  113. //=============================================================================
  114. //
  115. // UnloadUserProfile
  116. //
  117. // Unloads a user's profile that was loaded by LoadUserProfile()
  118. //
  119. // hToken        -  Token for the user, returned from LogonUser()
  120. // hProfile      -  hProfile member of the PROFILEINFO structure
  121. //
  122. // Returns:  TRUE if successful
  123. //           FALSE if not.  Call GetLastError() for more details
  124. //
  125. // Note:     The caller of this function must have admin privileges on the machine.
  126. //
  127. //=============================================================================
  128. function UnloadUserProfile(hToken: HANDLE; hProfile: HANDLE): BOOL; stdcall;
  129. {$EXTERNALSYM UnloadUserProfile}
  130. //=============================================================================
  131. //
  132. // GetProfilesDirectory
  133. //
  134. // Returns the path to the root of where all user profiles are stored.
  135. //
  136. // lpProfilesDir  -  Receives the path
  137. // lpcchSize      -  Size of lpProfilesDir
  138. //
  139. // Returns:  TRUE if successful
  140. //           FALSE if not.  Call GetLastError() for more details
  141. //
  142. // Note:     If lpProfilesDir is not large enough, the function will fail,
  143. //           and lpcchSize will contain the necessary buffer size.
  144. //
  145. // Example return value: C:Documents and Settings
  146. //
  147. //=============================================================================
  148. function GetProfilesDirectoryA(lpProfilesDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  149. {$EXTERNALSYM GetProfilesDirectoryA}
  150. function GetProfilesDirectoryW(lpProfilesDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  151. {$EXTERNALSYM GetProfilesDirectoryW}
  152. {$IFDEF UNICODE}
  153. function GetProfilesDirectory(lpProfilesDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  154. {$EXTERNALSYM GetProfilesDirectory}
  155. {$ELSE}
  156. function GetProfilesDirectory(lpProfilesDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  157. {$EXTERNALSYM GetProfilesDirectory}
  158. {$ENDIF}
  159. //=============================================================================
  160. //
  161. //  GetProfileType()
  162. //
  163. //  Returns the type of the profile that is loaded for a user.
  164. //
  165. //  dwFlags   - Returns the profile flags
  166. //
  167. //  Return:     TRUE if successful
  168. //              FALSE if an error occurs. Call GetLastError for more details
  169. //
  170. //  Comments:   if profile is not already loaded the function will return an error.
  171. //              The caller needs to have access to HKLM part of the registry.
  172. //              (exists by default)
  173. //
  174. //=============================================================================
  175. //
  176. // Flags that can be set in the dwFlags field
  177. //
  178. const
  179.   PT_TEMPORARY = $00000001; // A profile has been allocated that will be deleted at logoff.
  180.   {$EXTERNALSYM PT_TEMPORARY}
  181.   PT_ROAMING   = $00000002; // The loaded profile is a roaming profile.
  182.   {$EXTERNALSYM PT_ROAMING}
  183.   PT_MANDATORY = $00000004; // The loaded profile is mandatory.
  184.   {$EXTERNALSYM PT_MANDATORY}
  185. function GetProfileType(var dwFlags: DWORD): BOOL; stdcall;
  186. {$EXTERNALSYM GetProfileType}
  187. //=============================================================================
  188. //
  189. //  DeleteProfile()
  190. //
  191. //  Deletes the profile and all other user related settings from the machine
  192. //
  193. //  lpSidString    - String form of the user sid.
  194. //  lpProfilePath  - ProfilePath (if Null, lookup in the registry)
  195. //  lpComputerName - Computer Name from which profile has to be deleted
  196. //
  197. //  Return:     TRUE if successful
  198. //              FALSE if an error occurs. Call GetLastError for more details
  199. //
  200. //  Comments:   Deletes the profile directory, registry and appmgmt stuff
  201. //=============================================================================
  202. function DeleteProfileA(lpSidString: LPCSTR; lpProfilePath: LPCSTR;
  203.   lpComputerName: LPCSTR): BOOL; stdcall;
  204. {$EXTERNALSYM DeleteProfileA}
  205. function DeleteProfileW(lpSidString: LPCWSTR; lpProfilePath: LPCWSTR;
  206.   lpComputerName: LPCWSTR): BOOL; stdcall;
  207. {$EXTERNALSYM DeleteProfileW}
  208. {$IFDEF UNICODE}
  209. function DeleteProfile(lpSidString: LPCWSTR; lpProfilePath: LPCWSTR;
  210.   lpComputerName: LPCWSTR): BOOL; stdcall;
  211. {$EXTERNALSYM DeleteProfile}
  212. {$ELSE}
  213. function DeleteProfile(lpSidString: LPCSTR; lpProfilePath: LPCSTR;
  214.   lpComputerName: LPCSTR): BOOL; stdcall;
  215. {$EXTERNALSYM DeleteProfile}
  216. {$ENDIF}
  217. //=============================================================================
  218. //
  219. // GetDefaultUserProfilesDirectory
  220. //
  221. // Returns the path to the root of the default user profile
  222. //
  223. // lpProfileDir   -  Receives the path
  224. // lpcchSize      -  Size of lpProfileDir
  225. //
  226. // Returns:  TRUE if successful
  227. //           FALSE if not.  Call GetLastError() for more details
  228. //
  229. // Note:     If lpProfileDir is not large enough, the function will fail,
  230. //           and lpcchSize will contain the necessary buffer size.
  231. //
  232. // Example return value: C:Documents and SettingsDefault User
  233. //
  234. //=============================================================================
  235. function GetDefaultUserProfileDirectoryA(lpProfileDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  236. {$EXTERNALSYM GetDefaultUserProfileDirectoryA}
  237. function GetDefaultUserProfileDirectoryW(lpProfileDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  238. {$EXTERNALSYM GetDefaultUserProfileDirectoryW}
  239. {$IFDEF UNICODE}
  240. function GetDefaultUserProfileDirectory(lpProfileDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  241. {$EXTERNALSYM GetDefaultUserProfileDirectory}
  242. {$ELSE}
  243. function GetDefaultUserProfileDirectory(lpProfileDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  244. {$EXTERNALSYM GetDefaultUserProfileDirectory}
  245. {$ENDIF}
  246. //=============================================================================
  247. //
  248. // GetAllUsersProfilesDirectory
  249. //
  250. // Returns the path to the root of the All Users profile
  251. //
  252. // lpProfileDir   -  Receives the path
  253. // lpcchSize      -  Size of lpProfileDir
  254. //
  255. // Returns:  TRUE if successful
  256. //           FALSE if not.  Call GetLastError() for more details
  257. //
  258. // Note:     If lpProfileDir is not large enough, the function will fail,
  259. //           and lpcchSize will contain the necessary buffer size.
  260. //
  261. // Example return value: C:Documents and SettingsAll Users
  262. //
  263. //=============================================================================
  264. function GetAllUsersProfileDirectoryA(lpProfileDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  265. {$EXTERNALSYM GetAllUsersProfileDirectoryA}
  266. function GetAllUsersProfileDirectoryW(lpProfileDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  267. {$EXTERNALSYM GetAllUsersProfileDirectoryW}
  268. {$IFDEF UNICODE}
  269. function GetAllUsersProfileDirectory(lpProfileDir: LPWSTR; var lpcchSize: DWORD): BOOL; stdcall;
  270. {$EXTERNALSYM GetAllUsersProfileDirectory}
  271. {$ELSE}
  272. function GetAllUsersProfileDirectory(lpProfileDir: LPSTR; var lpcchSize: DWORD): BOOL; stdcall;
  273. {$EXTERNALSYM GetAllUsersProfileDirectory}
  274. {$ENDIF}
  275. //=============================================================================
  276. //
  277. // GetUserProfileDirectory
  278. //
  279. // Returns the path to the root of the requested user's profile
  280. //
  281. // hToken         -  User's token returned from LogonUser()
  282. // lpProfileDir   -  Receives the path
  283. // lpcchSize      -  Size of lpProfileDir
  284. //
  285. // Returns:  TRUE if successful
  286. //           FALSE if not.  Call GetLastError() for more details
  287. //
  288. // Note:     If lpProfileDir is not large enough, the function will fail,
  289. //           and lpcchSize will contain the necessary buffer size.
  290. //
  291. // Example return value: C:Documents and SettingsJoe
  292. //
  293. //=============================================================================
  294. function GetUserProfileDirectoryA(hToken: HANDLE; lpProfileDir: LPSTR;
  295.   var lpcchSize: DWORD): BOOL; stdcall;
  296. {$EXTERNALSYM GetUserProfileDirectoryA}
  297. function GetUserProfileDirectoryW(hToken: HANDLE; lpProfileDir: LPWSTR;
  298.   var lpcchSize: DWORD): BOOL; stdcall;
  299. {$EXTERNALSYM GetUserProfileDirectoryW}
  300. {$IFDEF UNICODE}
  301. function GetUserProfileDirectory(hToken: HANDLE; lpProfileDir: LPWSTR;
  302.   var lpcchSize: DWORD): BOOL; stdcall;
  303. {$EXTERNALSYM GetUserProfileDirectory}
  304. {$ELSE}
  305. function GetUserProfileDirectory(hToken: HANDLE; lpProfileDir: LPSTR;
  306.   var lpcchSize: DWORD): BOOL; stdcall;
  307. {$EXTERNALSYM GetUserProfileDirectory}
  308. {$ENDIF}
  309. //=============================================================================
  310. //
  311. // CreateEnvironmentBlock
  312. //
  313. // Returns the environment variables for the specified user.  This block
  314. // can then be passed to CreateProcessAsUser().
  315. //
  316. // lpEnvironment  -  Receives a pointer to the new environment block
  317. // hToken         -  User's token returned from LogonUser() (optional, can be NULL)
  318. // bInherit       -  Inherit from the current process's environment block
  319. //                   or start from a clean state.
  320. //
  321. // Returns:  TRUE if successful
  322. //           FALSE if not.  Call GetLastError() for more details
  323. //
  324. // Note:     If hToken is NULL, the returned environment block will contain
  325. //           system variables only.
  326. //
  327. //           Call DestroyEnvironmentBlock to free the buffer when finished.
  328. //
  329. //           If this block is passed to CreateProcessAsUser, the
  330. //           CREATE_UNICODE_ENVIRONMENT flag must also be set.
  331. //
  332. //=============================================================================
  333. function CreateEnvironmentBlock(lpEnvironment: LPLPVOID; hToken: HANDLE;
  334.   bInherit: BOOL): BOOL; stdcall;
  335. {$EXTERNALSYM CreateEnvironmentBlock}
  336. //=============================================================================
  337. //
  338. // DestroyEnvironmentBlock
  339. //
  340. // Frees environment variables created by CreateEnvironmentBlock
  341. //
  342. // lpEnvironment  -  A pointer to the environment block
  343. //
  344. // Returns:  TRUE if successful
  345. //           FALSE if not.  Call GetLastError() for more details
  346. //
  347. //=============================================================================
  348. function DestroyEnvironmentBlock(lpEnvironment: LPVOID): BOOL; stdcall;
  349. {$EXTERNALSYM DestroyEnvironmentBlock}
  350. //=============================================================================
  351. //
  352. // ExpandEnvironmentStringsForUser
  353. //
  354. // Expands the source string using the environment block for the
  355. // specified user.  If hToken is null, the system environment block
  356. // will be used (no user environment variables).
  357. //
  358. // hToken         -  User's token returned from LogonUser() (optional, can be NULL)
  359. // lpSrc          -  Pointer to the string with environment variables
  360. // lpDest         -  Buffer that receives the expanded string
  361. // dwSize         -  Size of lpDest in characters (max chars)
  362. //
  363. // Returns:  TRUE if successful
  364. //           FALSE if not.  Call GetLastError() for more details
  365. //
  366. // Note:     If the user profile for hToken is not loaded, this api will fail.
  367. //
  368. //=============================================================================
  369. function ExpandEnvironmentStringsForUserA(hToken: HANDLE; lpSrc: LPCSTR;
  370.   lpDest: LPSTR; dwSize: DWORD): BOOL; stdcall;
  371. {$EXTERNALSYM ExpandEnvironmentStringsForUserA}
  372. function ExpandEnvironmentStringsForUserW(hToken: HANDLE; lpSrc: LPCWSTR;
  373.   lpDest: LPWSTR; dwSize: DWORD): BOOL; stdcall;
  374. {$EXTERNALSYM ExpandEnvironmentStringsForUserW}
  375. {$IFDEF UNICODE}
  376. function ExpandEnvironmentStringsForUser(hToken: HANDLE; lpSrc: LPCWSTR;
  377.   lpDest: LPWSTR; dwSize: DWORD): BOOL; stdcall;
  378. {$EXTERNALSYM ExpandEnvironmentStringsForUser}
  379. {$ELSE}
  380. function ExpandEnvironmentStringsForUser(hToken: HANDLE; lpSrc: LPCSTR;
  381.   lpDest: LPSTR; dwSize: DWORD): BOOL; stdcall;
  382. {$EXTERNALSYM ExpandEnvironmentStringsForUser}
  383. {$ENDIF}
  384. //=============================================================================
  385. //
  386. // RefreshPolicy()
  387. //
  388. // Causes group policy to be applied immediately on the client machine
  389. //
  390. // bMachine  -  Refresh machine or user policy
  391. //
  392. // Returns:  TRUE if successful
  393. //           FALSE if not.  Call GetLastError() for more details
  394. //
  395. //=============================================================================
  396. function RefreshPolicy(bMachine: BOOL): BOOL; stdcall;
  397. {$EXTERNALSYM RefreshPolicy}
  398. //=============================================================================
  399. //
  400. // RefreshPolicyEx()
  401. //
  402. // Causes group policy to be applied immediately on the client machine.
  403. //
  404. // bMachine  -  Refresh machine or user policy
  405. // dwOptions -  Option specifying the kind of refresh that needs to be done.
  406. //
  407. // Returns:  TRUE if successful
  408. //           FALSE if not.  Call GetLastError() for more details
  409. //
  410. //=============================================================================
  411. const
  412.   RP_FORCE = 1; // Refresh policies without any optimisations.
  413.   {$EXTERNALSYM RP_FORCE}
  414. function RefreshPolicyEx(bMachine: BOOL; dwOptions: DWORD): BOOL; stdcall;
  415. {$EXTERNALSYM RefreshPolicyEx}
  416. //=============================================================================
  417. //
  418. // EnterCriticalPolicySection
  419. //
  420. // Pauses the background application of group policy to allow safe
  421. // reading of the registry.  Applications that need to read multiple
  422. // policy entries and ensure that the values are not changed while reading
  423. // them should use this function.
  424. //
  425. // The maximum amount of time an application can hold a critical section
  426. // is 10 minutes.  After 10 minutes, policy can be applied again.
  427. //
  428. // bMachine -  Pause machine or user policy
  429. //
  430. // Returns:  Handle if successful
  431. //           NULL if not.  Call GetLastError() for more details
  432. //
  433. // Note 1:  The handle returned should be passed to LeaveCriticalPolicySection
  434. // when finished.  Do not close this handle, LeaveCriticalPolicySection
  435. // will do that.
  436. //
  437. // Note 2:  If both user and machine critical sections need to be acquired then
  438. // they should be done in this order: first acquire user critical section and
  439. // then acquire machine critical section.
  440. //
  441. //=============================================================================
  442. function EnterCriticalPolicySection(bMachine: BOOL): HANDLE; stdcall;
  443. {$EXTERNALSYM EnterCriticalPolicySection}
  444. //=============================================================================
  445. //
  446. // LeaveCriticalPolicySection
  447. //
  448. // Resumes the background application of group policy.  See
  449. // EnterCriticalPolicySection for more details.
  450. //
  451. // hSection - Handle returned from EnterCriticalPolicySection
  452. //
  453. // Returns:  TRUE if successful
  454. //           FALSE if not.  Call GetLastError() for more details
  455. //
  456. // Note:  This function will close the handle.
  457. //
  458. //=============================================================================
  459. function LeaveCriticalPolicySection(hSection: HANDLE): BOOL; stdcall;
  460. {$EXTERNALSYM LeaveCriticalPolicySection}
  461. //=============================================================================
  462. //
  463. // RegisterGPNotification
  464. //
  465. // Entry point for registering for Group Policy change notification.
  466. //
  467. // Parameters: hEvent     -   Event to be notified, by calling SetEvent(hEvent)
  468. //             bMachine   -   If true, then register machine policy notification
  469. //                                     else register user policy notification
  470. //
  471. // Returns:    True if successful
  472. //             False if error occurs
  473. //
  474. // Notes:      Group Policy Notifications.  There are 2 ways an application can
  475. //             be notify when Group Policy is finished being applied.
  476. //
  477. //             1) Using the RegisterGPNotifcation function and waiting for the
  478. //                event to be signalled.
  479. //
  480. //             2) A WM_SETTINGCHANGE message is broadcast to all desktops.
  481. //                wParam - 1 if machine policy was applied, 0 if user policy was applied.
  482. //                lParam - Points to the string "Policy"
  483. //
  484. //=============================================================================
  485. function RegisterGPNotification(hEvent: HANDLE; bMachine: BOOL): BOOL; stdcall;
  486. {$EXTERNALSYM RegisterGPNotification}
  487. //=============================================================================
  488. //
  489. // UnregisterGPNotification
  490. //
  491. // Removes registration for a Group Policy change notification.
  492. //
  493. // Parameters: hEvent    -   Event to be removed
  494. //
  495. // Returns:    True if successful
  496. //             False if error occurs
  497. //
  498. //=============================================================================
  499. function UnregisterGPNotification(hEvent: HANDLE): BOOL; stdcall;
  500. {$EXTERNALSYM UnregisterGPNotification}
  501. //=============================================================================
  502. //
  503. // GPOptions flags
  504. //
  505. // These are the flags found in the GPOptions property of a DS object
  506. //
  507. // For a given DS object (Site, Domain, OU), the GPOptions property
  508. // contains options that effect all the GPOs link to this SDOU.
  509. //
  510. // This is a DWORD type
  511. //
  512. //=============================================================================
  513. const
  514.   GPC_BLOCK_POLICY = $00000001; // Block all non-forced policy from above
  515.   {$EXTERNALSYM GPC_BLOCK_POLICY}
  516. //=============================================================================
  517. //
  518. // GPLink flags
  519. //
  520. // These are the flags found on the GPLink property of a DS object after
  521. // the GPO path.
  522. //
  523. // For a given DS object (Site, Domain, OU), the GPLink property will
  524. // be in this text format
  525. //
  526. // [LDAP://CN={E615A0E3-C4F1-11D1-A3A7-00AA00615092},CN=Policies,CN=System,DC=mydomain,DC=Microsoft,DC=Com;1]
  527. //
  528. // The GUID is the GPO name, and the number following the LDAP path are the options
  529. // for that link from this DS object.  Note, there can be multiple GPOs
  530. // each in their own square brackets in a prioritized list.
  531. //
  532. //=============================================================================
  533. //
  534. // Options for a GPO link
  535. //
  536. const
  537.   GPO_FLAG_DISABLE = $00000001; // This GPO is disabled
  538.   {$EXTERNALSYM GPO_FLAG_DISABLE}
  539.   GPO_FLAG_FORCE   = $00000002; // Don't override the settings in
  540.   {$EXTERNALSYM GPO_FLAG_FORCE} // this GPO with settings from a GPO below it.
  541. //=============================================================================
  542. //
  543. // GetGPOList
  544. //
  545. //
  546. // Queries for the list of Group Policy Objects for the specified
  547. // user or machine.  This function will return a link list
  548. // of Group Policy Objects.  Call FreeGPOList to free the list.
  549. //
  550. // Note, most applications will not need to call this function.
  551. // This will primarily be used by services acting on behalf of
  552. // another user or machine.  The caller of this function will
  553. // need to look in each GPO for their specific policy
  554. //
  555. // This function can be called in two different ways.  Either the hToken for
  556. // a user or machine can be supplied and the correct name and domain
  557. // controller name will be generated, or hToken is NULL and the caller
  558. // must supply the name and the domain controller name.
  559. //
  560. // Calling this function with an hToken ensures the list of Group Policy
  561. // Objects is correct for the user or machine since security access checking
  562. // can be perfomed.  If hToken is not supplied, the security of the caller
  563. // is used instead which means that list may or may not be 100% correct
  564. // for the intended user / machine.  However, this is the fastest way
  565. // to call this function.
  566. //
  567. // hToken           - User or machine token, if NULL, lpName and lpHostName must be supplied
  568. // lpName           - User or machine name in DN format, if hToken is supplied, this must be NULL
  569. // lpHostName       - Domain DN name or domain controller name. If hToken is supplied, this must be NULL
  570. // lpComputerName   - Computer name to use to determine site location.  If NULL,
  571. //                    the local computer is used as the reference. Format:  \machinename
  572. // dwFlags          - Flags field.  See flags definition below
  573. // pGPOList         - Address of a pointer which receives the link list of GPOs
  574. //
  575. //
  576. // Returns:  TRUE if successful
  577. //           FALSE if not.  Use GetLastError() for more details.
  578. //
  579. // Examples:
  580. //
  581. // Here's how this function will typically be called for
  582. // looking up the list of GPOs for a user:
  583. //
  584. //      LPGROUP_POLICY_OBJECT  pGPOList;
  585. //
  586. //      if (GetGPOList (hToken, NULL, NULL, NULL, 0, &pGPOList))
  587. //      {
  588. //          // do processing here...
  589. //          FreeGPOList (pGPOList);
  590. //      }
  591. //
  592. //
  593. // Here's how this function will typically be called for
  594. // looking up the list of GPOs for a machine:
  595. //
  596. //      LPGROUP_POLICY_OBJECT  pGPOList;
  597. //
  598. //      if (GetGPOList (NULL, lpMachineName, lpHostName, lpMachineName,
  599. //                      GPO_LIST_FLAG_MACHINE, &pGPOList))
  600. //      {
  601. //          // do processing here...
  602. //          FreeGPOList (pGPOList);
  603. //      }
  604. //
  605. //=============================================================================
  606. //
  607. // Each Group Policy Object is associated (linked) with a site, domain,
  608. // organizational unit, or machine.
  609. //
  610. type
  611.   _GPO_LINK = (
  612.     GPLinkUnknown,                         // No link information available
  613.     GPLinkMachine,                         // GPO linked to a machine (local or remote)
  614.     GPLinkSite,                            // GPO linked to a site
  615.     GPLinkDomain,                          // GPO linked to a domain
  616.     GPLinkOrganizationalUnit);             // GPO linked to a organizational unit
  617.   {$EXTERNALSYM _GPO_LINK}
  618.   GPO_LINK = _GPO_LINK;
  619.   {$EXTERNALSYM GPO_LINK}
  620.   PGPO_LINK = ^GPO_LINK;
  621.   {$EXTERNALSYM PGPO_LINK}
  622.   TGpoLink = GPO_LINK;
  623.   PGpoLink = PGPO_LINK;
  624.   PGROUP_POLICY_OBJECTA = ^GROUP_POLICY_OBJECTA;
  625.   {$EXTERNALSYM PGROUP_POLICY_OBJECTA}
  626.   _GROUP_POLICY_OBJECTA = record
  627.     dwOptions: DWORD;             // See GPLink option flags above
  628.     dwVersion: DWORD;             // Revision number of the GPO
  629.     lpDSPath: LPSTR;              // Path to the Active Directory portion of the GPO
  630.     lpFileSysPath: LPSTR;         // Path to the file system portion of the GPO
  631.     lpDisplayName: LPSTR;         // Friendly display name
  632.     szGPOName: array [0..49] of CHAR; // Unique name
  633.     GPOLink: GPO_LINK;            // Link information
  634.     lParam: LPARAM;               // Free space for the caller to store GPO specific information
  635.     pNext: PGROUP_POLICY_OBJECTA; // Next GPO in the list
  636.     pPrev: PGROUP_POLICY_OBJECTA; // Previous GPO in the list
  637.     lpExtensions: LPSTR;          // Extensions that are relevant for this GPO
  638.     lParam2: LPARAM;              // Free space for the caller to store GPO specific information
  639.     lpLink: LPSTR;                // Path to the Active Directory site, domain, or organizational unit this GPO is linked to
  640.                                   // If this is the local GPO, this points to the word "Local"
  641.   end;
  642.   {$EXTERNALSYM _GROUP_POLICY_OBJECTA}
  643.   GROUP_POLICY_OBJECTA = _GROUP_POLICY_OBJECTA;
  644.   {$EXTERNALSYM GROUP_POLICY_OBJECTA}
  645.   TGroupPolicyObjectA = GROUP_POLICY_OBJECTA;
  646.   PGroupPolicyObjectA = PGROUP_POLICY_OBJECTA;
  647.   PGROUP_POLICY_OBJECTW = ^GROUP_POLICY_OBJECTW;
  648.   {$EXTERNALSYM PGROUP_POLICY_OBJECTW}
  649.   _GROUP_POLICY_OBJECTW = record
  650.     dwOptions: DWORD;             // See GPLink option flags above
  651.     dwVersion: DWORD;             // Revision number of the GPO
  652.     lpDSPath: LPWSTR;             // Path to the Active Directory portion of the GPO
  653.     lpFileSysPath: LPWSTR;        // Path to the file system portion of the GPO
  654.     lpDisplayName: LPWSTR;        // Friendly display name
  655.     szGPOName: array [0..49] of WCHAR; // Unique name
  656.     GPOLink: GPO_LINK;            // Link information
  657.     lParam: LPARAM;               // Free space for the caller to store GPO specific information
  658.     pNext: PGROUP_POLICY_OBJECTW; // Next GPO in the list
  659.     pPrev: PGROUP_POLICY_OBJECTW; // Previous GPO in the list
  660.     lpExtensions: LPWSTR;         // Extensions that are relevant for this GPO
  661.     lParam2: LPARAM;              // Free space for the caller to store GPO specific information
  662.     lpLink: LPWSTR;               // Path to the Active Directory site, domain, or organizational unit this GPO is linked to
  663.                                   // If this is the local GPO, this points to the word "Local"
  664.   end;
  665.   {$EXTERNALSYM _GROUP_POLICY_OBJECTW}
  666.   GROUP_POLICY_OBJECTW = _GROUP_POLICY_OBJECTW;
  667.   {$EXTERNALSYM GROUP_POLICY_OBJECTW}
  668.   TGroupPolicyObjectW = GROUP_POLICY_OBJECTW;
  669.   PGroupPolicyObjectW = PGROUP_POLICY_OBJECTW;
  670.   PPGROUP_POLICY_OBJECTA = ^PGROUP_POLICY_OBJECTA;
  671.   {$NODEFINE PPGROUP_POLICY_OBJECTA}
  672.   PPGROUP_POLICY_OBJECTW = ^PGROUP_POLICY_OBJECTW;
  673.   {$NODEFINE PPGROUP_POLICY_OBJECTW}
  674. {$IFDEF UNICODE}
  675.   GROUP_POLICY_OBJECT = GROUP_POLICY_OBJECTW;
  676.   {$EXTERNALSYM GROUP_POLICY_OBJECT}
  677.   PGROUP_POLICY_OBJECT = PGROUP_POLICY_OBJECTW;
  678.   {$EXTERNALSYM PGROUP_POLICY_OBJECT}
  679.   PPGROUP_POLICY_OBJECT = PPGROUP_POLICY_OBJECTW;
  680.   {$NODEFINE PPGROUP_POLICY_OBJECT}
  681.   TGroupPolicyObject = TGroupPolicyObjectW;
  682.   PGroupPolicyObject = PGroupPolicyObjectW;
  683. {$ELSE}
  684.   GROUP_POLICY_OBJECT = GROUP_POLICY_OBJECTA;
  685.   {$EXTERNALSYM GROUP_POLICY_OBJECT}
  686.   PGROUP_POLICY_OBJECT = PGROUP_POLICY_OBJECTA;
  687.   {$EXTERNALSYM PGROUP_POLICY_OBJECT}
  688.   PPGROUP_POLICY_OBJECT = PPGROUP_POLICY_OBJECTA;
  689.   {$NODEFINE PPGROUP_POLICY_OBJECT}
  690.   TGroupPolicyObject = TGroupPolicyObjectA;
  691.   PGroupPolicyObject = PGroupPolicyObjectA;
  692. {$ENDIF}
  693. //
  694. // dwFlags for GetGPOList()
  695. //
  696. const
  697.   GPO_LIST_FLAG_MACHINE  = $00000001; // Return machine policy information
  698.   {$EXTERNALSYM GPO_LIST_FLAG_MACHINE}
  699.   GPO_LIST_FLAG_SITEONLY = $00000002; // Return site policy information only
  700.   {$EXTERNALSYM GPO_LIST_FLAG_SITEONLY}
  701. function GetGPOListA(hToken: HANDLE; lpName: LPCSTR; lpHostName: LPCSTR;
  702.   lpComputerName: LPCSTR; dwFlags: DWORD; pGPOList: PPGROUP_POLICY_OBJECTA): BOOL; stdcall;
  703. {$EXTERNALSYM GetGPOListA}
  704. function GetGPOListW(hToken: HANDLE; lpName: LPCWSTR; lpHostName: LPCWSTR;
  705.   lpComputerName: LPCWSTR; dwFlags: DWORD; pGPOList: PPGROUP_POLICY_OBJECTW): BOOL; stdcall;
  706. {$EXTERNALSYM GetGPOListW}
  707. {$IFDEF UNICODE}
  708. function GetGPOList(hToken: HANDLE; lpName: LPCWSTR; lpHostName: LPCWSTR;
  709.   lpComputerName: LPCWSTR; dwFlags: DWORD; pGPOList: PPGROUP_POLICY_OBJECT): BOOL; stdcall;
  710. {$EXTERNALSYM GetGPOList}
  711. {$ELSE}
  712. function GetGPOList(hToken: HANDLE; lpName: LPCSTR; lpHostName: LPCSTR;
  713. lpComputerName: LPCSTR; dwFlags: DWORD; pGPOList: PPGROUP_POLICY_OBJECT): BOOL; stdcall;
  714. {$EXTERNALSYM GetGPOList}
  715. {$ENDIF}
  716. //=============================================================================
  717. //
  718. // FreeGPOList
  719. //
  720. //
  721. // Frees the linked list returned from GetGPOList
  722. //
  723. // pGPOList - Pointer to the linked list of GPOs
  724. //
  725. //
  726. // Returns:  TRUE if successful
  727. //           FALSE if not
  728. //
  729. //=============================================================================
  730. function FreeGPOListA(pGPOList: PGROUP_POLICY_OBJECTA): BOOL; stdcall;
  731. {$EXTERNALSYM FreeGPOListA}
  732. function FreeGPOListW(pGPOList: PGROUP_POLICY_OBJECTW): BOOL; stdcall;
  733. {$EXTERNALSYM FreeGPOListW}
  734. {$IFDEF UNICODE}
  735. function FreeGPOList(pGPOList: PGROUP_POLICY_OBJECT): BOOL; stdcall;
  736. {$EXTERNALSYM FreeGPOList}
  737. {$ELSE}
  738. function FreeGPOList(pGPOList: PGROUP_POLICY_OBJECT): BOOL; stdcall;
  739. {$EXTERNALSYM FreeGPOList}
  740. {$ENDIF}
  741. //=============================================================================
  742. //
  743. // GetAppliedGPOList
  744. //
  745. // Queries for the list of applied Group Policy Objects for the specified
  746. // user or machine and specified client side extension. This function will return
  747. // a linked listof Group Policy Objects.  Call FreeGPOList to free the list.
  748. //
  749. // dwFlags          - User or machine policy, if it is GPO_LIST_FLAG_MACHINE then
  750. //                    return machine policy information
  751. // pMachineName     - Name of remote computer in the form \computername. If null
  752. //                    then local computer is used.
  753. // pSidUser         - Security id of user (relevant for user policy). If pMachineName is
  754. //                    null and pSidUser is null then it means current logged on user.
  755. //                    If pMachine is null and pSidUser is non-null then it means user
  756. //                    represented by pSidUser on local machine. If pMachineName is non-null
  757. //                    then and if dwFlags specifies user policy, then pSidUser must be
  758. //                    non-null.
  759. // pGuidExtension   - Guid of the specified extension
  760. // ppGPOList        - Address of a pointer which receives the link list of GPOs
  761. //
  762. // The return value is a Win32 error code. ERROR_SUCCESS means the GetAppliedGPOList
  763. // function completed successfully. Otherwise it indicates that the function failed.
  764. //
  765. //=============================================================================
  766. function GetAppliedGPOListA(dwFlags: DWORD; pMachineName: LPCSTR; pSidUser: PSID;
  767.   pGuidExtension: LPGUID; ppGPOList: PPGROUP_POLICY_OBJECTA): DWORD; stdcall;
  768. {$EXTERNALSYM GetAppliedGPOListA}
  769. function GetAppliedGPOListW(dwFlags: DWORD; pMachineName: LPCWSTR; pSidUser: PSID;
  770.   pGuidExtension: LPGUID; ppGPOList: PPGROUP_POLICY_OBJECTW): DWORD; stdcall;
  771. {$EXTERNALSYM GetAppliedGPOListW}
  772. {$IFDEF UNICODE}
  773. function GetAppliedGPOList(dwFlags: DWORD; pMachineName: LPCWSTR; pSidUser: PSID;
  774.   pGuidExtension: LPGUID; ppGPOList: PPGROUP_POLICY_OBJECT): DWORD; stdcall;
  775. {$EXTERNALSYM GetAppliedGPOList}
  776. {$ELSE}
  777. function GetAppliedGPOList(dwFlags: DWORD; pMachineName: LPCSTR; pSidUser: PSID;
  778.   pGuidExtension: LPGUID; ppGPOList: PPGROUP_POLICY_OBJECT): DWORD; stdcall;
  779. {$EXTERNALSYM GetAppliedGPOList}
  780. {$ENDIF}
  781. //=============================================================================
  782. //
  783. // Group Policy Object client side extension support
  784. //
  785. // Flags, data structures and function prototype
  786. //
  787. // To register your extension, create a subkey under this key
  788. //
  789. // SoftwareMicrosoftWindows NTCurrentVersionWinlogonGPExtensions
  790. //
  791. // The subkey needs to be a guid so that it is unique. The noname value of the subkey
  792. // can be the friendly name of the extension. Then add these values:
  793. //
  794. //     DllName                      REG_EXPAND_SZ  Path to your DLL
  795. //     ProcessGroupPolicy           REG_SZ       Function name (see PFNPROCESSGROUPPOLICY prototype). This
  796. //                                                 is obsolete, it has been superseded by ProcessGroupPolicyEx.
  797. //                                                 It's here for backward compatibility reasons only.
  798. //     ProcessGroupPolicyEx         REG_SZ       Function name (see PFNPROCESSGROUPPOLICYEX prototype)
  799. //     GenerateGroupPolicy          REG_SZ       Function name for Rsop (see PFNGENERATEGROUPPOLICY prototype)
  800. //     NoMachinePolicy              REG_DWORD    True, if extension does not have to be called when
  801. //                                                 machine policies are being processed.
  802. //     NoUserPolicy                 REG_DWORD    True, if extension does not have to be called when
  803. //                                                 user policies are being processed.
  804. //     NoSlowLink                   REG_DWORD    True, if extension does not have to be called on a slow link
  805. //     NoBackgroundPolicy           REG_DWORD    True, if extension does not have to be called 
  806. //                                                 for background policy processing.
  807. //     NoGPOListChanges             REG_DWORD    True, if extension does not have to be called when
  808. //                                                 there are no changes between cached and current GPO lists.
  809. //     PerUserLocalSettings         REG_DWORD    True, if user policies have to be cached on a per user and
  810. //                                                 per machine basis.
  811. //     RequiresSuccessfulRegistry   REG_DWORD    True, if extension should be called only if registry extension
  812. //                                                 was successfully processed.
  813. //     EnableAsynchronousProcessing REG_DWORD    True, if registry extension will complete its processing
  814. //                                                 asynchronously.
  815. //     NotifyLinkTransition         REG_DWORD    True, if extension should be called when a change in link
  816. //                                                 speed is detected between previous policy application and
  817. //                                                 current policy application.
  818. //
  819. // The return value is a Win32 error code. ERROR_SUCCESS means the ProcessGroupPolicy
  820. // function completed successfully. If return value is ERROR_OVERRIDE_NOCHANGES then it
  821. // means that the extension will be called the next time even if NoGPOListChanges is set
  822. // and there are no changes to the GPO list. Any other return value indicates that the
  823. // ProcessGroupPolicy or ProcessGroupPolicyEx function failed.
  824. //
  825. //=============================================================================
  826. const
  827.   GP_DLLNAME                       = 'DllName';
  828.   {$EXTERNALSYM GP_DLLNAME}
  829.   GP_ENABLEASYNCHRONOUSPROCESSING  = 'EnableAsynchronousProcessing';
  830.   {$EXTERNALSYM GP_ENABLEASYNCHRONOUSPROCESSING}
  831.   GP_MAXNOGPOLISTCHANGESINTERVAL   = 'MaxNoGPOListChangesInterval';
  832.   {$EXTERNALSYM GP_MAXNOGPOLISTCHANGESINTERVAL}
  833.   GP_NOBACKGROUNDPOLICY            = 'NoBackgroundPolicy';
  834.   {$EXTERNALSYM GP_NOBACKGROUNDPOLICY}
  835.   GP_NOGPOLISTCHANGES              = 'NoGPOListChanges';
  836.   {$EXTERNALSYM GP_NOGPOLISTCHANGES}
  837.   GP_NOMACHINEPOLICY               = 'NoMachinePolicy';
  838.   {$EXTERNALSYM GP_NOMACHINEPOLICY}
  839.   GP_NOSLOWLINK                    = 'NoSlowLink';
  840.   {$EXTERNALSYM GP_NOSLOWLINK}
  841.   GP_NOTIFYLINKTRANSITION          = 'NotifyLinkTransition';
  842.   {$EXTERNALSYM GP_NOTIFYLINKTRANSITION}
  843.   GP_NOUSERPOLICY                  = 'NoUserPolicy';
  844.   {$EXTERNALSYM GP_NOUSERPOLICY}
  845.   GP_PERUSERLOCALSETTINGS          = 'PerUserLocalSettings';
  846.   {$EXTERNALSYM GP_PERUSERLOCALSETTINGS}
  847.   GP_PROCESSGROUPPOLICY            = 'ProcessGroupPolicy';
  848.   {$EXTERNALSYM GP_PROCESSGROUPPOLICY}
  849.   GP_REQUIRESSUCCESSFULREGISTRY    = 'RequiresSuccessfulRegistry';
  850.   {$EXTERNALSYM GP_REQUIRESSUCCESSFULREGISTRY}
  851.   GPO_INFO_FLAG_MACHINE        = $00000001;   // Apply machine policy rather than user policy
  852.   {$EXTERNALSYM GPO_INFO_FLAG_MACHINE}
  853.   GPO_INFO_FLAG_BACKGROUND     = $00000010;   // Background refresh of policy (ok to do slow stuff)
  854.   {$EXTERNALSYM GPO_INFO_FLAG_BACKGROUND}
  855.   GPO_INFO_FLAG_SLOWLINK       = $00000020;   // Policy is being applied across a slow link
  856.   {$EXTERNALSYM GPO_INFO_FLAG_SLOWLINK}
  857.   GPO_INFO_FLAG_VERBOSE        = $00000040;   // Verbose output to the eventlog
  858.   {$EXTERNALSYM GPO_INFO_FLAG_VERBOSE}
  859.   GPO_INFO_FLAG_NOCHANGES      = $00000080;   // No changes were detected to the Group Policy Objects
  860.   {$EXTERNALSYM GPO_INFO_FLAG_NOCHANGES}
  861.   GPO_INFO_FLAG_LINKTRANSITION = $00000100;   // A change in link speed was detected between previous policy
  862.   {$EXTERNALSYM GPO_INFO_FLAG_LINKTRANSITION} // application and current policy application
  863.   GPO_INFO_FLAG_LOGRSOP_TRANSITION = $00000200;   // A Change in Rsop Logging was detected between previous policy
  864.   {$EXTERNALSYM GPO_INFO_FLAG_LOGRSOP_TRANSITION} // application and current policy application, (new intf only)
  865.   GPO_INFO_FLAG_FORCED_REFRESH     = $00000400;  // Forced Refresh is being applied. redo policies.
  866.   {$EXTERNALSYM GPO_INFO_FLAG_FORCED_REFRESH}
  867.   GPO_INFO_FLAG_SAFEMODE_BOOT      = $00000800;  // windows safe mode boot flag
  868.   {$EXTERNALSYM GPO_INFO_FLAG_SAFEMODE_BOOT}
  869.   GPO_INFO_FLAG_ASYNC_FOREGROUND   = $00001000;  // Asynchronous foreground refresh of policy
  870.   {$EXTERNALSYM GPO_INFO_FLAG_ASYNC_FOREGROUND}
  871.   GPO_INFO_FLAG_REPORT             = $00002000;  // Report all settings for one GPO rather than the resultant settings across multiple GPOs
  872.   {$EXTERNALSYM GPO_INFO_FLAG_REPORT}
  873. type
  874.   ASYNCCOMPLETIONHANDLE = UINT_PTR;
  875.   {$EXTERNALSYM ASYNCCOMPLETIONHANDLE}
  876.   PFNSTATUSMESSAGECALLBACK = function (bVerbose: BOOL; lpMessage: LPWSTR): DWORD; stdcall;
  877.   {$EXTERNALSYM PFNSTATUSMESSAGECALLBACK}
  878.   PFNPROCESSGROUPPOLICY = function (
  879.     dwFlags: DWORD;                              // GPO_INFO_FLAGS
  880.     hToken: HANDLE;                              // User or machine token
  881.     hKeyRoot: HKEY;                              // Root of registry
  882.     pDeletedGPOList: PGROUP_POLICY_OBJECT;       // Linked list of deleted GPOs
  883.     pChangedGPOList: PGROUP_POLICY_OBJECT;       // Linked list of changed GPOs
  884.     pHandle: ASYNCCOMPLETIONHANDLE;              // For asynchronous completion
  885.     pbAbort: LPBOOL;                             // If true, then abort GPO processing
  886.     pStatusCallback: PFNSTATUSMESSAGECALLBACK    // Callback function for displaying status messages
  887.     ): DWORD; stdcall;                           // Note, this can be NULL
  888.   {$EXTERNALSYM PFNPROCESSGROUPPOLICY}
  889.   PFNPROCESSGROUPPOLICYEX = function (
  890.     dwFlags: DWORD;                              // GPO_INFO_FLAGS
  891.     hToken: HANDLE;                              // User or machine token
  892.     hKeyRoot: HKEY;                              // Root of registry
  893.     pDeletedGPOList: PGROUP_POLICY_OBJECT;       // Linked list of deleted GPOs
  894.     pChangedGPOList: PGROUP_POLICY_OBJECT;       // Linked list of changed GPOs
  895.     pHandle: ASYNCCOMPLETIONHANDLE;              // For asynchronous completion
  896.     pbAbort: PBOOL;                              // If true, then abort GPO processing
  897.     pStatusCallback: PFNSTATUSMESSAGECALLBACK;   // Callback function for displaying status messages
  898.                                                  // Note, this can be NULL
  899.     pWbemServices: IWbemServices;                // Pointer to namespace to log diagnostic mode data
  900.                                                  // Note, this will be NULL when Rsop logging is disabled
  901.     var pRsopStatus: HRESULT                     // RSOP Logging succeeded or not.
  902.     ): DWORD; stdcall;
  903.   {$EXTERNALSYM PFNPROCESSGROUPPOLICYEX}
  904.   PRSOPTOKEN = PVOID;
  905.   {$EXTERNALSYM PRSOPTOKEN}
  906.   _RSOP_TARGET = record
  907.     pwszAccountName: PWCHAR;                   // Account name
  908.     pwszNewSOM: PWCHAR;                        // New domain or OU location for account
  909.     psaSecurityGroups: PSafeArray;             // New security groups
  910.     pRsopToken: PRSOPTOKEN;                    // Rsop token for use with Rsop security Api's
  911.     pGPOList: PGROUP_POLICY_OBJECT;            // Linked list of GPOs
  912.     pWbemServices: IWbemServices;              // Pointer to namespace to log planning mode data
  913.   end;
  914.   {$EXTERNALSYM _RSOP_TARGET}
  915.   RSOP_TARGET = _RSOP_TARGET;
  916.   {$EXTERNALSYM RSOP_TARGET}
  917.   PRSOP_TARGET = ^RSOP_TARGET;
  918.   {$EXTERNALSYM PRSOP_TARGET}
  919.   TRsopTarget = RSOP_TARGET;
  920.   PRsopTarget = PRSOP_TARGET;  
  921.   PFNGENERATEGROUPPOLICY = function (
  922.     dwFlags: DWORD;                              // GPO_INFO_FLAGS
  923.     var pbAbort: BOOL;                           // If true, then abort GPO processing
  924.     pwszSite: PWCHAR;                            // Site the target computer is in
  925.     pComputerTarget: PRSOP_TARGET;               // Computer target info, can be null
  926.     pUserTarget: PRSOP_TARGET                    // User target info, can be null
  927.     ): DWORD; stdcall;
  928.   {$EXTERNALSYM PFNGENERATEGROUPPOLICY}
  929. //
  930. // GUID that identifies the registry extension
  931. //
  932. const
  933.   REGISTRY_EXTENSION_GUID: GUID = (
  934.     D1: $35378EAC; D2:$683F; D3:$11D2; D4:($A8, $9A, $00, $C0, $4F, $BB, $CF, $A2));
  935.   {$EXTERNALSYM REGISTRY_EXTENSION_GUID}
  936. //=============================================================================
  937. //
  938. // Group Policy Object client side asynchronous extension processing
  939. //
  940. // extensionId    - Unique guid identifying the extension
  941. // pAsyncHandle   - Asynchronous completion handle that was passed to extension in
  942. //                  ProcessGroupPolicy call
  943. // dwStatus       - Completion status of asynchronous processing
  944. //
  945. // The return value is a Win32 error code. ERROR_SUCCESS means the ProcessGroupPolicyCompleted
  946. // function completed successfully. Otherwise it indicates that the function failed.
  947. //
  948. //=============================================================================
  949. type
  950.   REFGPEXTENSIONID = LPGUID;
  951.   {$EXTERNALSYM REFGPEXTENSIONID}
  952. function ProcessGroupPolicyCompleted(extensionId: REFGPEXTENSIONID;
  953.   pAsyncHandle: ASYNCCOMPLETIONHANDLE; dwStatus: DWORD): DWORD; stdcall;
  954. {$EXTERNALSYM ProcessGroupPolicyCompleted}
  955. //=============================================================================
  956. //
  957. // Group Policy Object client side asynchronous extension processing
  958. //
  959. // extensionId    - Unique guid identifying the extension
  960. // pAsyncHandle   - Asynchronous completion handle that was passed to extension in
  961. //                  ProcessGroupPolicy call
  962. // dwStatus       - Completion status of asynchronous processing
  963. // RsopStatus     - RSoP Logging status
  964. //
  965. // The return value is a Win32 error code. ERROR_SUCCESS means the ProcessGroupPolicyCompleted
  966. // function completed successfully. Otherwise it indicates that the function failed.
  967. //
  968. //=============================================================================
  969. function ProcessGroupPolicyCompletedEx(extensionId: REFGPEXTENSIONID; pAsyncHandle: ASYNCCOMPLETIONHANDLE;
  970.   dwStatus: DWORD; RsopStatus: HRESULT): DWORD; stdcall;
  971. {$EXTERNALSYM ProcessGroupPolicyCompletedEx}
  972. //=============================================================================
  973. //
  974. // Function:    RsopAccessCheckByType
  975. //
  976. // Description: Determines whether the security descriptor pointed to by pSecurityDescriptor
  977. //                              grants the set of access rights specified in dwDesiredAccessMask
  978. //                              to the client identified by the RSOPTOKEN pointed to by pRsopToken.
  979. //
  980. // pSecurityDescriptor  - Security Descriptor on the object
  981. // pPrincipalSelfSid    - Principal Sid
  982. // pRsopToken           - Pointer to a valid RSOPTOKEN against which access needs to be checked
  983. // dwDesiredAccessMask  - Mask of requested generic and/or standard and or specific access rights
  984. // pObjectTypeList      - Object Type List
  985. // ObjectTypeListLength - Object Type List Length
  986. // pGenericMapping      - Generic Mapping
  987. // pPrivilegeSet        - privilege set
  988. // pdwPrivilegeSetLength- privilege set length
  989. // pdwGrantedAccessMask - On success, if pbAccessStatus is true, it contains
  990. //                                         the mask of standard and specific rights granted.
  991. //                                         If pbAccessStatus is false, it is set to 0.
  992. //                                         On failure, it is not modified.
  993. // pbAccessStatus       - On success, indicates wether the requested set
  994. //                                    of access rights was granted.
  995. //                                    On failure, it is not modified
  996. //
  997. // Returns S_OK on success or appropriate error code.
  998. // For additional details, look at the documentation of AccessCheckByType
  999. //=============================================================================
  1000. function RsopAccessCheckByType(pSecurityDescriptor: PSECURITY_DESCRIPTOR; pPrincipalSelfSid: PSID;
  1001.   pRsopToken: PRSOPTOKEN; dwDesiredAccessMask: DWORD; pObjectTypeList: POBJECT_TYPE_LIST;
  1002.   ObjectTypeListLength: DWORD; pGenericMapping: PGENERIC_MAPPING; pPrivilegeSet: PPRIVILEGE_SET;
  1003.   pdwPrivilegeSetLength: LPDWORD; pdwGrantedAccessMask: LPDWORD; pbAccessStatus: LPBOOL): HRESULT; stdcall;
  1004. {$EXTERNALSYM RsopAccessCheckByType}
  1005. //=============================================================================
  1006. //
  1007. // Function:    RsopFileAccessCheck
  1008. //
  1009. // Description: Determines whether the security descriptor on the file grants the set of file access
  1010. //                              rights specified in dwDesiredAccessMask
  1011. //                              to the client identified by the RSOPTOKEN pointed to by pRsopToken.
  1012. //
  1013. // pszFileName          - Name of an existing filename
  1014. // pRsopToken           - Pointer to a valid RSOPTOKEN against which access needs to be checked
  1015. // dwDesiredAccessMask  - Mask of requested generic and/or standard and or specific access rights
  1016. // pdwGrantedAccessMask - On success, if pbAccessStatus is true, it contains
  1017. //                                         the mask of standard and specific rights granted.
  1018. //                                         If pbAccessStatus is false, it is set to 0.
  1019. //                                         On failure, it is not modified.
  1020. // pbAccessStatus       - On success, indicates wether the requested set
  1021. //                                    of access rights was granted.
  1022. //                                    On failure, it is not modified
  1023. //
  1024. // Returns S_OK on success or appropriate error code
  1025. //=============================================================================
  1026. function RsopFileAccessCheck(pszFileName: LPWSTR; pRsopToken: PRSOPTOKEN; dwDesiredAccessMask: DWORD;
  1027.   pdwGrantedAccessMask: LPDWORD; pbAccessStatus: LPBOOL): HRESULT; stdcall;
  1028. {$EXTERNALSYM RsopFileAccessCheck}
  1029. type
  1030.   _SETTINGSTATUS = (
  1031.     RSOPUnspecified,
  1032.     RSOPApplied,
  1033.     RSOPIgnored,
  1034.     RSOPFailed,
  1035.     RSOPSubsettingFailed);
  1036.   {$EXTERNALSYM _SETTINGSTATUS}
  1037.   SETTINGSTATUS = _SETTINGSTATUS;
  1038.   {$EXTERNALSYM SETTINGSTATUS}
  1039.   TSettingStatus = SETTINGSTATUS;
  1040. //=============================================================================
  1041. //
  1042. //  POLICYSETTINGSTATUSINFO
  1043. //
  1044. //  Describes the instance of RSOP_PolicySettingStatus
  1045. //
  1046. //  szKey               - OPTIONAL, if NULL, the key is generated on the fly
  1047. //  szEventSource       - name of the source generation event log messages
  1048. //  szEventLogName      - name of the event log database where the messages are logged
  1049. //  dwEventID           - event log message ID
  1050. //  status              - status of the policy setting
  1051. //  timeLogged          - time at which the event log message was logged
  1052. //
  1053. //=============================================================================
  1054. type
  1055.   _POLICYSETTINGSTATUSINFO = record
  1056.     szKey: LPWSTR;
  1057.     szEventSource: LPWSTR;
  1058.     szEventLogName: LPWSTR;
  1059.     dwEventID: DWORD;
  1060.     dwErrorCode: DWORD;
  1061.     status: SETTINGSTATUS;
  1062.     timeLogged: SYSTEMTIME;
  1063.   end;
  1064.   {$EXTERNALSYM _POLICYSETTINGSTATUSINFO}
  1065.   POLICYSETTINGSTATUSINFO = _POLICYSETTINGSTATUSINFO;
  1066.   {$EXTERNALSYM POLICYSETTINGSTATUSINFO}
  1067.   LPPOLICYSETTINGSTATUSINFO = ^POLICYSETTINGSTATUSINFO;
  1068.   {$EXTERNALSYM LPPOLICYSETTINGSTATUSINFO}
  1069.   TPolicySettingStatusInfo = POLICYSETTINGSTATUSINFO;
  1070.   PPolicySettingStatusInfo = LPPOLICYSETTINGSTATUSINFO;
  1071. //=============================================================================
  1072. //
  1073. //  RsopSetPolicySettingStatus
  1074. //
  1075. //  Creates an instance of RSOP_PolicySettingStatus and RSOP_PolicySettingLink
  1076. //  and links RSOP_PolicySettingStatus to RSOP_PolicySetting
  1077. //
  1078. //  dwFlags             - flags
  1079. //  pServices           - RSOP namespace
  1080. //  pSettingInstance    - instance of RSOP_PolicySetting or its children
  1081. //  nInfo               - number of PolicySettingStatusInfo
  1082. //  pStatus             - array of PolicySettingStatusInfo
  1083. //
  1084. //  Return:     S_OK if successful, HRESULT otherwise
  1085. //
  1086. //=============================================================================
  1087. function RsopSetPolicySettingStatus(dwFlags: DWORD; pServices: IWbemServices;
  1088.   pSettingInstance: IWbemClassObject; nInfo: DWORD;
  1089.   pStatus: LPPOLICYSETTINGSTATUSINFO): HRESULT; stdcall;
  1090. {$EXTERNALSYM RsopSetPolicySettingStatus}
  1091. //=============================================================================
  1092. //
  1093. //  RsopResetPolicySettingStatus
  1094. //
  1095. //  Unlinks RSOP_PolicySettingStatus from RSOP_PolicySetting,
  1096. //  deletes the instance of RSOP_PolicySettingStatus and RSOP_PolicySettingLink
  1097. //  and optionally deletes the instance of RSOP_PolicySetting
  1098. //
  1099. //  dwFlags             - flags
  1100. //  pServices           - RSOP namespace
  1101. //  pSettingInstance    - instance of RSOP_PolicySetting or its children
  1102. //
  1103. //  Return:     S_OK if successful, HRESULT otherwise
  1104. //
  1105. //=============================================================================
  1106. function RsopResetPolicySettingStatus(dwFlags: DWORD; pServices: IWbemServices;
  1107.   pSettingInstance: IWbemClassObject): HRESULT; stdcall;
  1108. {$EXTERNALSYM RsopResetPolicySettingStatus}
  1109. //=============================================================================
  1110. //
  1111. // Flags for RSoP WMI providers
  1112. //
  1113. //=============================================================================
  1114. // planning mode provider flags
  1115. const
  1116.   FLAG_NO_GPO_FILTER     = DWORD($80000000);  // GPOs are not filtered, implies FLAG_NO_CSE_INVOKE
  1117.   {$EXTERNALSYM FLAG_NO_GPO_FILTER}
  1118.   FLAG_NO_CSE_INVOKE     = $40000000;  // only GP processing done for planning mode
  1119.   {$EXTERNALSYM FLAG_NO_CSE_INVOKE}
  1120.   FLAG_ASSUME_SLOW_LINK  = $20000000;  // planning mode RSoP assumes slow link
  1121.   {$EXTERNALSYM FLAG_ASSUME_SLOW_LINK}
  1122.   FLAG_LOOPBACK_MERGE    = $10000000;  // planning mode RSoP assumes merge loop back
  1123.   {$EXTERNALSYM FLAG_LOOPBACK_MERGE}
  1124.   FLAG_LOOPBACK_REPLACE  = $08000000;  // planning mode RSoP assumes replace loop back
  1125.   {$EXTERNALSYM FLAG_LOOPBACK_REPLACE}
  1126.   FLAG_ASSUME_USER_WQLFILTER_TRUE  = $04000000;  // planning mode RSoP assumes all comp filters to be true
  1127.   {$EXTERNALSYM FLAG_ASSUME_USER_WQLFILTER_TRUE}
  1128.   FLAG_ASSUME_COMP_WQLFILTER_TRUE  = $02000000;  // planning mode RSoP assumes all user filters to be true
  1129.   {$EXTERNALSYM FLAG_ASSUME_COMP_WQLFILTER_TRUE}
  1130.   FLAG_PLANNING_MODE               = $01000000;  // flag that indicates that a given namespace was created
  1131.   {$EXTERNALSYM FLAG_PLANNING_MODE}              // for planning mode. This flag cannot be passed in but the
  1132.          // relevant subnamespace will be marked with this flag
  1133. // diagnostic mode provider flags
  1134.   FLAG_NO_USER                     = $00000001;  // Don't get any user data
  1135.   {$EXTERNALSYM FLAG_NO_USER}
  1136.   FLAG_NO_COMPUTER                 = $00000002;  // Don't get any machine data
  1137.   {$EXTERNALSYM FLAG_NO_COMPUTER}
  1138.   FLAG_FORCE_CREATENAMESPACE       = $00000004;  // Delete and recreate the namespace for this snapshot.
  1139.   {$EXTERNALSYM FLAG_FORCE_CREATENAMESPACE}
  1140. //=============================================================================
  1141. //
  1142. // Extended Errors returned by RSoP WMI Providers
  1143. //
  1144. //=============================================================================
  1145. // User accessing the rsop provider doesn't have access to user data.
  1146.   RSOP_USER_ACCESS_DENIED = $00000001;
  1147.   {$EXTERNALSYM RSOP_USER_ACCESS_DENIED}
  1148. // User accessing the rsop provider doesn't have access to computer data.
  1149.   RSOP_COMPUTER_ACCESS_DENIED = $00000002;
  1150.   {$EXTERNALSYM RSOP_COMPUTER_ACCESS_DENIED}
  1151. // This user is an interactive non admin user, the temp snapshot namespace already exists
  1152. // and the FLAG_FORCE_CREATENAMESPACE was not passed in
  1153.   RSOP_TEMPNAMESPACE_EXISTS = $00000004;
  1154.   {$EXTERNALSYM RSOP_TEMPNAMESPACE_EXISTS}
  1155. implementation
  1156. const
  1157.   userenvlib = 'userenv.dll';
  1158. {$IFDEF DYNAMIC_LINK}
  1159. var
  1160.   _LoadUserProfileA: Pointer;
  1161. function LoadUserProfileA;
  1162. begin
  1163.   GetProcedureAddress(_LoadUserProfileA, userenvlib, 'LoadUserProfileA');
  1164.   asm
  1165.     mov esp, ebp
  1166.     pop ebp
  1167.     jmp [_LoadUserProfileA]
  1168.   end;
  1169. end;
  1170. {$ELSE}
  1171. function LoadUserProfileA; external userenvlib name 'LoadUserProfileA';
  1172. {$ENDIF DYNAMIC_LINK}
  1173. {$IFDEF DYNAMIC_LINK}
  1174. var
  1175.   _LoadUserProfileW: Pointer;
  1176. function LoadUserProfileW;
  1177. begin
  1178.   GetProcedureAddress(_LoadUserProfileW, userenvlib, 'LoadUserProfileW');
  1179.   asm
  1180.     mov esp, ebp
  1181.     pop ebp
  1182.     jmp [_LoadUserProfileW]
  1183.   end;
  1184. end;
  1185. {$ELSE}
  1186. function LoadUserProfileW; external userenvlib name 'LoadUserProfileW';
  1187. {$ENDIF DYNAMIC_LINK}
  1188. {$IFDEF UNICODE}
  1189. {$IFDEF DYNAMIC_LINK}
  1190. var
  1191.   _LoadUserProfile: Pointer;
  1192. function LoadUserProfile;
  1193. begin
  1194.   GetProcedureAddress(_LoadUserProfile, userenvlib, 'LoadUserProfileW');
  1195.   asm
  1196.     mov esp, ebp
  1197.     pop ebp
  1198.     jmp [_LoadUserProfile]
  1199.   end;
  1200. end;
  1201. {$ELSE}
  1202. function LoadUserProfile; external userenvlib name 'LoadUserProfileW';
  1203. {$ENDIF DYNAMIC_LINK}
  1204. {$ELSE}
  1205. {$IFDEF DYNAMIC_LINK}
  1206. var
  1207.   _LoadUserProfile: Pointer;
  1208. function LoadUserProfile;
  1209. begin
  1210.   GetProcedureAddress(_LoadUserProfile, userenvlib, 'LoadUserProfileA');
  1211.   asm
  1212.     mov esp, ebp
  1213.     pop ebp
  1214.     jmp [_LoadUserProfile]
  1215.   end;
  1216. end;
  1217. {$ELSE}
  1218. function LoadUserProfile; external userenvlib name 'LoadUserProfileA';
  1219. {$ENDIF DYNAMIC_LINK}
  1220. {$ENDIF}
  1221. {$IFDEF DYNAMIC_LINK}
  1222. var
  1223.   _UnloadUserProfile: Pointer;
  1224. function UnloadUserProfile;
  1225. begin
  1226.   GetProcedureAddress(_UnloadUserProfile, userenvlib, 'UnloadUserProfile');
  1227.   asm
  1228.     mov esp, ebp
  1229.     pop ebp
  1230.     jmp [_UnloadUserProfile]
  1231.   end;
  1232. end;
  1233. {$ELSE}
  1234. function UnloadUserProfile; external userenvlib name 'UnloadUserProfile';
  1235. {$ENDIF DYNAMIC_LINK}
  1236. {$IFDEF DYNAMIC_LINK}
  1237. var
  1238.   _GetProfilesDirectoryA: Pointer;
  1239. function GetProfilesDirectoryA;
  1240. begin
  1241.   GetProcedureAddress(_GetProfilesDirectoryA, userenvlib, 'GetProfilesDirectoryA');
  1242.   asm
  1243.     mov esp, ebp
  1244.     pop ebp
  1245.     jmp [_GetProfilesDirectoryA]
  1246.   end;
  1247. end;
  1248. {$ELSE}
  1249. function GetProfilesDirectoryA; external userenvlib name 'GetProfilesDirectoryA';
  1250. {$ENDIF DYNAMIC_LINK}
  1251. {$IFDEF DYNAMIC_LINK}
  1252. var
  1253.   _GetProfilesDirectoryW: Pointer;
  1254. function GetProfilesDirectoryW;
  1255. begin
  1256.   GetProcedureAddress(_GetProfilesDirectoryW, userenvlib, 'GetProfilesDirectoryW');
  1257.   asm
  1258.     mov esp, ebp
  1259.     pop ebp
  1260.     jmp [_GetProfilesDirectoryW]
  1261.   end;
  1262. end;
  1263. {$ELSE}
  1264. function GetProfilesDirectoryW; external userenvlib name 'GetProfilesDirectoryW';
  1265. {$ENDIF DYNAMIC_LINK}
  1266. {$IFDEF UNICODE}
  1267. {$IFDEF DYNAMIC_LINK}
  1268. var
  1269.   _GetProfilesDirectory: Pointer;
  1270. function GetProfilesDirectory;
  1271. begin
  1272.   GetProcedureAddress(_GetProfilesDirectory, userenvlib, 'GetProfilesDirectoryW');
  1273.   asm
  1274.     mov esp, ebp
  1275.     pop ebp
  1276.     jmp [_GetProfilesDirectory]
  1277.   end;
  1278. end;
  1279. {$ELSE}
  1280. function GetProfilesDirectory; external userenvlib name 'GetProfilesDirectoryW';
  1281. {$ENDIF DYNAMIC_LINK}
  1282. {$ELSE}
  1283. {$IFDEF DYNAMIC_LINK}
  1284. var
  1285.   _GetProfilesDirectory: Pointer;
  1286. function GetProfilesDirectory;
  1287. begin
  1288.   GetProcedureAddress(_GetProfilesDirectory, userenvlib, 'GetProfilesDirectoryA');
  1289.   asm
  1290.     mov esp, ebp
  1291.     pop ebp
  1292.     jmp [_GetProfilesDirectory]
  1293.   end;
  1294. end;
  1295. {$ELSE}
  1296. function GetProfilesDirectory; external userenvlib name 'GetProfilesDirectoryA';
  1297. {$ENDIF DYNAMIC_LINK}
  1298. {$ENDIF}
  1299. {$IFDEF DYNAMIC_LINK}
  1300. var
  1301.   _GetProfileType: Pointer;
  1302. function GetProfileType;
  1303. begin
  1304.   GetProcedureAddress(_GetProfileType, userenvlib, 'GetProfileType');
  1305.   asm
  1306.     mov esp, ebp
  1307.     pop ebp
  1308.     jmp [_GetProfileType]
  1309.   end;
  1310. end;
  1311. {$ELSE}
  1312. function GetProfileType; external userenvlib name 'GetProfileType';
  1313. {$ENDIF DYNAMIC_LINK}
  1314. {$IFDEF DYNAMIC_LINK}
  1315. var
  1316.   _DeleteProfileA: Pointer;
  1317. function DeleteProfileA;
  1318. begin
  1319.   GetProcedureAddress(_DeleteProfileA, userenvlib, 'DeleteProfileA');
  1320.   asm
  1321.     mov esp, ebp
  1322.     pop ebp
  1323.     jmp [_DeleteProfileA]
  1324.   end;
  1325. end;
  1326. {$ELSE}
  1327. function DeleteProfileA; external userenvlib name 'DeleteProfileA';
  1328. {$ENDIF DYNAMIC_LINK}
  1329. {$IFDEF DYNAMIC_LINK}
  1330. var
  1331.   _DeleteProfileW: Pointer;
  1332. function DeleteProfileW;
  1333. begin
  1334.   GetProcedureAddress(_DeleteProfileW, userenvlib, 'DeleteProfileW');
  1335.   asm
  1336.     mov esp, ebp
  1337.     pop ebp
  1338.     jmp [_DeleteProfileW]
  1339.   end;
  1340. end;
  1341. {$ELSE}
  1342. function DeleteProfileW; external userenvlib name 'DeleteProfileW';
  1343. {$ENDIF DYNAMIC_LINK}
  1344. {$IFDEF UNICODE}
  1345. {$IFDEF DYNAMIC_LINK}
  1346. var
  1347.   _DeleteProfile: Pointer;
  1348. function DeleteProfile;
  1349. begin
  1350.   GetProcedureAddress(_DeleteProfile, userenvlib, 'DeleteProfileW');
  1351.   asm
  1352.     mov esp, ebp
  1353.     pop ebp
  1354.     jmp [_DeleteProfile]
  1355.   end;
  1356. end;
  1357. {$ELSE}
  1358. function DeleteProfile; external userenvlib name 'DeleteProfileW';
  1359. {$ENDIF DYNAMIC_LINK}
  1360. {$ELSE}
  1361. {$IFDEF DYNAMIC_LINK}
  1362. var
  1363.   _DeleteProfile: Pointer;
  1364. function DeleteProfile;
  1365. begin
  1366.   GetProcedureAddress(_DeleteProfile, userenvlib, 'DeleteProfileA');
  1367.   asm
  1368.     mov esp, ebp
  1369.     pop ebp
  1370.     jmp [_DeleteProfile]
  1371.   end;
  1372. end;
  1373. {$ELSE}
  1374. function DeleteProfile; external userenvlib name 'DeleteProfileA';
  1375. {$ENDIF DYNAMIC_LINK}
  1376. {$ENDIF}
  1377. {$IFDEF DYNAMIC_LINK}
  1378. var
  1379.   _GetDefaultUserProfileDirectoryA: Pointer;
  1380. function GetDefaultUserProfileDirectoryA;
  1381. begin
  1382.   GetProcedureAddress(_GetDefaultUserProfileDirectoryA, userenvlib, 'GetDefaultUserProfileDirectoryA');
  1383.   asm
  1384.     mov esp, ebp
  1385.     pop ebp
  1386.     jmp [_GetDefaultUserProfileDirectoryA]
  1387.   end;
  1388. end;
  1389. {$ELSE}
  1390. function GetDefaultUserProfileDirectoryA; external userenvlib name 'GetDefaultUserProfileDirectoryA';
  1391. {$ENDIF DYNAMIC_LINK}
  1392. {$IFDEF DYNAMIC_LINK}
  1393. var
  1394.   _GetDefaultUserProfileDirectoryW: Pointer;
  1395. function GetDefaultUserProfileDirectoryW;
  1396. begin
  1397.   GetProcedureAddress(_GetDefaultUserProfileDirectoryW, userenvlib, 'GetDefaultUserProfileDirectoryW');
  1398.   asm
  1399.     mov esp, ebp
  1400.     pop ebp
  1401.     jmp [_GetDefaultUserProfileDirectoryW]
  1402.   end;
  1403. end;
  1404. {$ELSE}
  1405. function GetDefaultUserProfileDirectoryW; external userenvlib name 'GetDefaultUserProfileDirectoryW';
  1406. {$ENDIF DYNAMIC_LINK}
  1407. {$IFDEF UNICODE}
  1408. {$IFDEF DYNAMIC_LINK}
  1409. var
  1410.   _GetDefaultUserProfileDirectory: Pointer;
  1411. function GetDefaultUserProfileDirectory;
  1412. begin
  1413.   GetProcedureAddress(_GetDefaultUserProfileDirectory, userenvlib, 'GetDefaultUserProfileDirectoryW');
  1414.   asm
  1415.     mov esp, ebp
  1416.     pop ebp
  1417.     jmp [_GetDefaultUserProfileDirectory]
  1418.   end;
  1419. end;
  1420. {$ELSE}
  1421. function GetDefaultUserProfileDirectory; external userenvlib name 'GetDefaultUserProfileDirectoryW';
  1422. {$ENDIF DYNAMIC_LINK}
  1423. {$ELSE}
  1424. {$IFDEF DYNAMIC_LINK}
  1425. var
  1426.   _GetDefaultUserProfileDirectory: Pointer;
  1427. function GetDefaultUserProfileDirectory;
  1428. begin
  1429.   GetProcedureAddress(_GetDefaultUserProfileDirectory, userenvlib, 'GetDefaultUserProfileDirectoryA');
  1430.   asm
  1431.     mov esp, ebp
  1432.     pop ebp
  1433.     jmp [_GetDefaultUserProfileDirectory]
  1434.   end;
  1435. end;
  1436. {$ELSE}
  1437. function GetDefaultUserProfileDirectory; external userenvlib name 'GetDefaultUserProfileDirectoryA';
  1438. {$ENDIF DYNAMIC_LINK}
  1439. {$ENDIF}
  1440. {$IFDEF DYNAMIC_LINK}
  1441. var
  1442.   _GetAllUsersProfileDirectoryA: Pointer;
  1443. function GetAllUsersProfileDirectoryA;
  1444. begin
  1445.   GetProcedureAddress(_GetAllUsersProfileDirectoryA, userenvlib, 'GetAllUsersProfileDirectoryA');
  1446.   asm
  1447.     mov esp, ebp
  1448.     pop ebp
  1449.     jmp [_GetAllUsersProfileDirectoryA]
  1450.   end;
  1451. end;
  1452. {$ELSE}
  1453. function GetAllUsersProfileDirectoryA; external userenvlib name 'GetAllUsersProfileDirectoryA';
  1454. {$ENDIF DYNAMIC_LINK}
  1455. {$IFDEF DYNAMIC_LINK}
  1456. var
  1457.   _GetAllUsersProfileDirectoryW: Pointer;
  1458. function GetAllUsersProfileDirectoryW;
  1459. begin
  1460.   GetProcedureAddress(_GetAllUsersProfileDirectoryW, userenvlib, 'GetAllUsersProfileDirectoryW');
  1461.   asm
  1462.     mov esp, ebp
  1463.     pop ebp
  1464.     jmp [_GetAllUsersProfileDirectoryW]
  1465.   end;
  1466. end;
  1467. {$ELSE}
  1468. function GetAllUsersProfileDirectoryW; external userenvlib name 'GetAllUsersProfileDirectoryW';
  1469. {$ENDIF DYNAMIC_LINK}
  1470. {$IFDEF UNICODE}
  1471. {$IFDEF DYNAMIC_LINK}
  1472. var
  1473.   _GetAllUsersProfileDirectory: Pointer;
  1474. function GetAllUsersProfileDirectory;
  1475. begin
  1476.   GetProcedureAddress(_GetAllUsersProfileDirectory, userenvlib, 'GetAllUsersProfileDirectoryW');
  1477.   asm
  1478.     mov esp, ebp
  1479.     pop ebp
  1480.     jmp [_GetAllUsersProfileDirectory]
  1481.   end;
  1482. end;
  1483. {$ELSE}
  1484. function GetAllUsersProfileDirectory; external userenvlib name 'GetAllUsersProfileDirectoryW';
  1485. {$ENDIF DYNAMIC_LINK}
  1486. {$ELSE}
  1487. {$IFDEF DYNAMIC_LINK}
  1488. var
  1489.   _GetAllUsersProfileDirectory: Pointer;
  1490. function GetAllUsersProfileDirectory;
  1491. begin
  1492.   GetProcedureAddress(_GetAllUsersProfileDirectory, userenvlib, 'GetAllUsersProfileDirectoryA');
  1493.   asm
  1494.     mov esp, ebp
  1495.     pop ebp
  1496.     jmp [_GetAllUsersProfileDirectory]
  1497.   end;
  1498. end;
  1499. {$ELSE}
  1500. function GetAllUsersProfileDirectory; external userenvlib name 'GetAllUsersProfileDirectoryA';
  1501. {$ENDIF DYNAMIC_LINK}
  1502. {$ENDIF}
  1503. {$IFDEF DYNAMIC_LINK}
  1504. var
  1505.   _GetUserProfileDirectoryA: Pointer;
  1506. function GetUserProfileDirectoryA;
  1507. begin
  1508.   GetProcedureAddress(_GetUserProfileDirectoryA, userenvlib, 'GetUserProfileDirectoryA');
  1509.   asm
  1510.     mov esp, ebp
  1511.     pop ebp
  1512.     jmp [_GetUserProfileDirectoryA]
  1513.   end;
  1514. end;
  1515. {$ELSE}
  1516. function GetUserProfileDirectoryA; external userenvlib name 'GetUserProfileDirectoryA';
  1517. {$ENDIF DYNAMIC_LINK}
  1518. {$IFDEF DYNAMIC_LINK}
  1519. var
  1520.   _GetUserProfileDirectoryW: Pointer;
  1521. function GetUserProfileDirectoryW;
  1522. begin
  1523.   GetProcedureAddress(_GetUserProfileDirectoryW, userenvlib, 'GetUserProfileDirectoryW');
  1524.   asm
  1525.     mov esp, ebp
  1526.     pop ebp
  1527.     jmp [_GetUserProfileDirectoryW]
  1528.   end;
  1529. end;
  1530. {$ELSE}
  1531. function GetUserProfileDirectoryW; external userenvlib name 'GetUserProfileDirectoryW';
  1532. {$ENDIF DYNAMIC_LINK}
  1533. {$IFDEF UNICODE}
  1534. {$IFDEF DYNAMIC_LINK}
  1535. var
  1536.   _GetUserProfileDirectory: Pointer;
  1537. function GetUserProfileDirectory;
  1538. begin
  1539.   GetProcedureAddress(_GetUserProfileDirectory, userenvlib, 'GetUserProfileDirectoryW');
  1540.   asm
  1541.     mov esp, ebp
  1542.     pop ebp
  1543.     jmp [_GetUserProfileDirectory]
  1544.   end;
  1545. end;
  1546. {$ELSE}
  1547. function GetUserProfileDirectory; external userenvlib name 'GetUserProfileDirectoryW';
  1548. {$ENDIF DYNAMIC_LINK}
  1549. {$ELSE}
  1550. {$IFDEF DYNAMIC_LINK}
  1551. var
  1552.   _GetUserProfileDirectory: Pointer;
  1553. function GetUserProfileDirectory;
  1554. begin
  1555.   GetProcedureAddress(_GetUserProfileDirectory, userenvlib, 'GetUserProfileDirectoryA');
  1556.   asm
  1557.     mov esp, ebp
  1558.     pop ebp
  1559.     jmp [_GetUserProfileDirectory]
  1560.   end;
  1561. end;
  1562. {$ELSE}
  1563. function GetUserProfileDirectory; external userenvlib name 'GetUserProfileDirectoryA';
  1564. {$ENDIF DYNAMIC_LINK}
  1565. {$ENDIF}
  1566. {$IFDEF DYNAMIC_LINK}
  1567. var
  1568.   _CreateEnvironmentBlock: Pointer;
  1569. function CreateEnvironmentBlock;
  1570. begin
  1571.   GetProcedureAddress(_CreateEnvironmentBlock, userenvlib, 'CreateEnvironmentBlock');
  1572.   asm
  1573.     mov esp, ebp
  1574.     pop ebp
  1575.     jmp [_CreateEnvironmentBlock]
  1576.   end;
  1577. end;
  1578. {$ELSE}
  1579. function CreateEnvironmentBlock; external userenvlib name 'CreateEnvironmentBlock';
  1580. {$ENDIF DYNAMIC_LINK}
  1581. {$IFDEF DYNAMIC_LINK}
  1582. var
  1583.   _DestroyEnvironmentBlock: Pointer;
  1584. function DestroyEnvironmentBlock;
  1585. begin
  1586.   GetProcedureAddress(_DestroyEnvironmentBlock, userenvlib, 'DestroyEnvironmentBlock');
  1587.   asm
  1588.     mov esp, ebp
  1589.     pop ebp
  1590.     jmp [_DestroyEnvironmentBlock]
  1591.   end;
  1592. end;
  1593. {$ELSE}
  1594. function DestroyEnvironmentBlock; external userenvlib name 'DestroyEnvironmentBlock';
  1595. {$ENDIF DYNAMIC_LINK}
  1596. {$IFDEF DYNAMIC_LINK}
  1597. var
  1598.   _ExpandEnvStringsForUserA: Pointer;
  1599. function ExpandEnvironmentStringsForUserA;
  1600. begin
  1601.   GetProcedureAddress(_ExpandEnvStringsForUserA, userenvlib, 'ExpandEnvironmentStringsForUserA');
  1602.   asm
  1603.     mov esp, ebp
  1604.     pop ebp
  1605.     jmp [_ExpandEnvStringsForUserA]
  1606.   end;
  1607. end;
  1608. {$ELSE}
  1609. function ExpandEnvironmentStringsForUserA; external userenvlib name 'ExpandEnvironmentStringsForUserA';
  1610. {$ENDIF DYNAMIC_LINK}
  1611. {$IFDEF DYNAMIC_LINK}
  1612. var
  1613.   _ExpandEnvStringsForUserW: Pointer;
  1614. function ExpandEnvironmentStringsForUserW;
  1615. begin
  1616.   GetProcedureAddress(_ExpandEnvStringsForUserW, userenvlib, 'ExpandEnvironmentStringsForUserW');
  1617.   asm
  1618.     mov esp, ebp
  1619.     pop ebp
  1620.     jmp [_ExpandEnvStringsForUserW]
  1621.   end;
  1622. end;
  1623. {$ELSE}
  1624. function ExpandEnvironmentStringsForUserW; external userenvlib name 'ExpandEnvironmentStringsForUserW';
  1625. {$ENDIF DYNAMIC_LINK}
  1626. {$IFDEF UNICODE}
  1627. {$IFDEF DYNAMIC_LINK}
  1628. var
  1629.   _ExpandEnvironmentStringsForUser: Pointer;
  1630. function ExpandEnvironmentStringsForUser;
  1631. begin
  1632.   GetProcedureAddress(_ExpandEnvironmentStringsForUser, userenvlib, 'ExpandEnvironmentStringsForUserW');
  1633.   asm
  1634.     mov esp, ebp
  1635.     pop ebp
  1636.     jmp [_ExpandEnvironmentStringsForUser]
  1637.   end;
  1638. end;
  1639. {$ELSE}
  1640. function ExpandEnvironmentStringsForUser; external userenvlib name 'ExpandEnvironmentStringsForUserW';
  1641. {$ENDIF DYNAMIC_LINK}
  1642. {$ELSE}
  1643. {$IFDEF DYNAMIC_LINK}
  1644. var
  1645.   _ExpandEnvironmentStringsForUser: Pointer;
  1646. function ExpandEnvironmentStringsForUser;
  1647. begin
  1648.   GetProcedureAddress(_ExpandEnvironmentStringsForUser, userenvlib, 'ExpandEnvironmentStringsForUserA');
  1649.   asm
  1650.     mov esp, ebp
  1651.     pop ebp
  1652.     jmp [_ExpandEnvironmentStringsForUser]
  1653.   end;
  1654. end;
  1655. {$ELSE}
  1656. function ExpandEnvironmentStringsForUser; external userenvlib name 'ExpandEnvironmentStringsForUserA';
  1657. {$ENDIF DYNAMIC_LINK}
  1658. {$ENDIF}
  1659. {$IFDEF DYNAMIC_LINK}
  1660. var
  1661.   _RefreshPolicy: Pointer;
  1662. function RefreshPolicy;
  1663. begin
  1664.   GetProcedureAddress(_RefreshPolicy, userenvlib, 'RefreshPolicy');
  1665.   asm
  1666.     mov esp, ebp
  1667.     pop ebp
  1668.     jmp [_RefreshPolicy]
  1669.   end;
  1670. end;
  1671. {$ELSE}
  1672. function RefreshPolicy; external userenvlib name 'RefreshPolicy';
  1673. {$ENDIF DYNAMIC_LINK}
  1674. {$IFDEF DYNAMIC_LINK}
  1675. var
  1676.   _RefreshPolicyEx: Pointer;
  1677. function RefreshPolicyEx;
  1678. begin
  1679.   GetProcedureAddress(_RefreshPolicyEx, userenvlib, 'RefreshPolicyEx');
  1680.   asm
  1681.     mov esp, ebp
  1682.     pop ebp
  1683.     jmp [_RefreshPolicyEx]
  1684.   end;
  1685. end;
  1686. {$ELSE}
  1687. function RefreshPolicyEx; external userenvlib name 'RefreshPolicyEx';
  1688. {$ENDIF DYNAMIC_LINK}
  1689. {$IFDEF DYNAMIC_LINK}
  1690. var
  1691.   _EnterCriticalPolicySection: Pointer;
  1692. function EnterCriticalPolicySection;
  1693. begin
  1694.   GetProcedureAddress(_EnterCriticalPolicySection, userenvlib, 'EnterCriticalPolicySection');
  1695.   asm
  1696.     mov esp, ebp
  1697.     pop ebp
  1698.     jmp [_EnterCriticalPolicySection]
  1699.   end;
  1700. end;
  1701. {$ELSE}
  1702. function EnterCriticalPolicySection; external userenvlib name 'EnterCriticalPolicySection';
  1703. {$ENDIF DYNAMIC_LINK}
  1704. {$IFDEF DYNAMIC_LINK}
  1705. var
  1706.   _LeaveCriticalPolicySection: Pointer;
  1707. function LeaveCriticalPolicySection;
  1708. begin
  1709.   GetProcedureAddress(_LeaveCriticalPolicySection, userenvlib, 'LeaveCriticalPolicySection');
  1710.   asm
  1711.     mov esp, ebp
  1712.     pop ebp
  1713.     jmp [_LeaveCriticalPolicySection]
  1714.   end;
  1715. end;
  1716. {$ELSE}
  1717. function LeaveCriticalPolicySection; external userenvlib name 'LeaveCriticalPolicySection';
  1718. {$ENDIF DYNAMIC_LINK}
  1719. {$IFDEF DYNAMIC_LINK}
  1720. var
  1721.   _RegisterGPNotification: Pointer;
  1722. function RegisterGPNotification;
  1723. begin
  1724.   GetProcedureAddress(_RegisterGPNotification, userenvlib, 'RegisterGPNotification');
  1725.   asm
  1726.     mov esp, ebp
  1727.     pop ebp
  1728.     jmp [_RegisterGPNotification]
  1729.   end;
  1730. end;
  1731. {$ELSE}
  1732. function RegisterGPNotification; external userenvlib name 'RegisterGPNotification';
  1733. {$ENDIF DYNAMIC_LINK}
  1734. {$IFDEF DYNAMIC_LINK}
  1735. var
  1736.   _UnregisterGPNotification: Pointer;
  1737. function UnregisterGPNotification;
  1738. begin
  1739.   GetProcedureAddress(_UnregisterGPNotification, userenvlib, 'UnregisterGPNotification');
  1740.   asm
  1741.     mov esp, ebp
  1742.     pop ebp
  1743.     jmp [_UnregisterGPNotification]
  1744.   end;
  1745. end;
  1746. {$ELSE}
  1747. function UnregisterGPNotification; external userenvlib name 'UnregisterGPNotification';
  1748. {$ENDIF DYNAMIC_LINK}
  1749. {$IFDEF DYNAMIC_LINK}
  1750. var
  1751.   _GetGPOListA: Pointer;
  1752. function GetGPOListA;
  1753. begin
  1754.   GetProcedureAddress(_GetGPOListA, userenvlib, 'GetGPOListA');
  1755.   asm
  1756.     mov esp, ebp
  1757.     pop ebp
  1758.     jmp [_GetGPOListA]
  1759.   end;
  1760. end;
  1761. {$ELSE}
  1762. function GetGPOListA; external userenvlib name 'GetGPOListA';
  1763. {$ENDIF DYNAMIC_LINK}
  1764. {$IFDEF DYNAMIC_LINK}
  1765. var
  1766.   _GetGPOListW: Pointer;
  1767. function GetGPOListW;
  1768. begin
  1769.   GetProcedureAddress(_GetGPOListW, userenvlib, 'GetGPOListW');
  1770.   asm
  1771.     mov esp, ebp
  1772.     pop ebp
  1773.     jmp [_GetGPOListW]
  1774.   end;
  1775. end;
  1776. {$ELSE}
  1777. function GetGPOListW; external userenvlib name 'GetGPOListW';
  1778. {$ENDIF DYNAMIC_LINK}
  1779. {$IFDEF UNICODE}
  1780. {$IFDEF DYNAMIC_LINK}
  1781. var
  1782.   _GetGPOList: Pointer;
  1783. function GetGPOList;
  1784. begin
  1785.   GetProcedureAddress(_GetGPOList, userenvlib, 'GetGPOListW');
  1786.   asm
  1787.     mov esp, ebp
  1788.     pop ebp
  1789.     jmp [_GetGPOList]
  1790.   end;
  1791. end;
  1792. {$ELSE}
  1793. function GetGPOList; external userenvlib name 'GetGPOListW';
  1794. {$ENDIF DYNAMIC_LINK}
  1795. {$ELSE}
  1796. {$IFDEF DYNAMIC_LINK}
  1797. var
  1798.   _GetGPOList: Pointer;
  1799. function GetGPOList;
  1800. begin
  1801.   GetProcedureAddress(_GetGPOList, userenvlib, 'GetGPOListA');
  1802.   asm
  1803.     mov esp, ebp
  1804.     pop ebp
  1805.     jmp [_GetGPOList]
  1806.   end;
  1807. end;
  1808. {$ELSE}
  1809. function GetGPOList; external userenvlib name 'GetGPOListA';
  1810. {$ENDIF DYNAMIC_LINK}
  1811. {$ENDIF}
  1812. {$IFDEF DYNAMIC_LINK}
  1813. var
  1814.   _FreeGPOListA: Pointer;
  1815. function FreeGPOListA;
  1816. begin
  1817.   GetProcedureAddress(_FreeGPOListA, userenvlib, 'FreeGPOListA');
  1818.   asm
  1819.     mov esp, ebp
  1820.     pop ebp
  1821.     jmp [_FreeGPOListA]
  1822.   end;
  1823. end;
  1824. {$ELSE}
  1825. function FreeGPOListA; external userenvlib name 'FreeGPOListA';
  1826. {$ENDIF DYNAMIC_LINK}
  1827. {$IFDEF DYNAMIC_LINK}
  1828. var
  1829.   _FreeGPOListW: Pointer;
  1830. function FreeGPOListW;
  1831. begin
  1832.   GetProcedureAddress(_FreeGPOListW, userenvlib, 'FreeGPOListW');
  1833.   asm
  1834.     mov esp, ebp
  1835.     pop ebp
  1836.     jmp [_FreeGPOListW]
  1837.   end;
  1838. end;
  1839. {$ELSE}
  1840. function FreeGPOListW; external userenvlib name 'FreeGPOListW';
  1841. {$ENDIF DYNAMIC_LINK}
  1842. {$IFDEF UNICODE}
  1843. {$IFDEF DYNAMIC_LINK}
  1844. var
  1845.   _FreeGPOList: Pointer;
  1846. function FreeGPOList;
  1847. begin
  1848.   GetProcedureAddress(_FreeGPOList, userenvlib, 'FreeGPOListW');
  1849.   asm
  1850.     mov esp, ebp
  1851.     pop ebp
  1852.     jmp [_FreeGPOList]
  1853.   end;
  1854. end;
  1855. {$ELSE}
  1856. function FreeGPOList; external userenvlib name 'FreeGPOListW';
  1857. {$ENDIF DYNAMIC_LINK}
  1858. {$ELSE}
  1859. {$IFDEF DYNAMIC_LINK}
  1860. var
  1861.   _FreeGPOList: Pointer;
  1862. function FreeGPOList;
  1863. begin
  1864.   GetProcedureAddress(_FreeGPOList, userenvlib, 'FreeGPOListA');
  1865.   asm
  1866.     mov esp, ebp
  1867.     pop ebp
  1868.     jmp [_FreeGPOList]
  1869.   end;
  1870. end;
  1871. {$ELSE}
  1872. function FreeGPOList; external userenvlib name 'FreeGPOListA';
  1873. {$ENDIF DYNAMIC_LINK}
  1874. {$ENDIF}
  1875. {$IFDEF DYNAMIC_LINK}
  1876. var
  1877.   _GetAppliedGPOListA: Pointer;
  1878. function GetAppliedGPOListA;
  1879. begin
  1880.   GetProcedureAddress(_GetAppliedGPOListA, userenvlib, 'GetAppliedGPOListA');
  1881.   asm
  1882.     mov esp, ebp
  1883.     pop ebp
  1884.     jmp [_GetAppliedGPOListA]
  1885.   end;
  1886. end;
  1887. {$ELSE}
  1888. function GetAppliedGPOListA; external userenvlib name 'GetAppliedGPOListA';
  1889. {$ENDIF DYNAMIC_LINK}
  1890. {$IFDEF DYNAMIC_LINK}
  1891. var
  1892.   _GetAppliedGPOListW: Pointer;
  1893. function GetAppliedGPOListW;
  1894. begin
  1895.   GetProcedureAddress(_GetAppliedGPOListW, userenvlib, 'GetAppliedGPOListW');
  1896.   asm
  1897.     mov esp, ebp
  1898.     pop ebp
  1899.     jmp [_GetAppliedGPOListW]
  1900.   end;
  1901. end;
  1902. {$ELSE}
  1903. function GetAppliedGPOListW; external userenvlib name 'GetAppliedGPOListW';
  1904. {$ENDIF DYNAMIC_LINK}
  1905. {$IFDEF UNICODE}
  1906. {$IFDEF DYNAMIC_LINK}
  1907. var
  1908.   _GetAppliedGPOList: Pointer;
  1909. function GetAppliedGPOList;
  1910. begin
  1911.   GetProcedureAddress(_GetAppliedGPOList, userenvlib, 'GetAppliedGPOListW');
  1912.   asm
  1913.     mov esp, ebp
  1914.     pop ebp
  1915.     jmp [_GetAppliedGPOList]
  1916.   end;
  1917. end;
  1918. {$ELSE}
  1919. function GetAppliedGPOList; external userenvlib name 'GetAppliedGPOListW';
  1920. {$ENDIF DYNAMIC_LINK}
  1921. {$ELSE}
  1922. {$IFDEF DYNAMIC_LINK}
  1923. var
  1924.   _GetAppliedGPOList: Pointer;
  1925. function GetAppliedGPOList;
  1926. begin
  1927.   GetProcedureAddress(_GetAppliedGPOList, userenvlib, 'GetAppliedGPOListA');
  1928.   asm
  1929.     mov esp, ebp
  1930.     pop ebp
  1931.     jmp [_GetAppliedGPOList]
  1932.   end;
  1933. end;
  1934. {$ELSE}
  1935. function GetAppliedGPOList; external userenvlib name 'GetAppliedGPOListA';
  1936. {$ENDIF DYNAMIC_LINK}
  1937. {$ENDIF}
  1938. {$IFDEF DYNAMIC_LINK}
  1939. var
  1940.   _ProcessGroupPolicyCompleted: Pointer;
  1941. function ProcessGroupPolicyCompleted;
  1942. begin
  1943.   GetProcedureAddress(_ProcessGroupPolicyCompleted, userenvlib, 'ProcessGroupPolicyCompleted');
  1944.   asm
  1945.     mov esp, ebp
  1946.     pop ebp
  1947.     jmp [_ProcessGroupPolicyCompleted]
  1948.   end;
  1949. end;
  1950. {$ELSE}
  1951. function ProcessGroupPolicyCompleted; external userenvlib name 'ProcessGroupPolicyCompleted';
  1952. {$ENDIF DYNAMIC_LINK}
  1953. {$IFDEF DYNAMIC_LINK}
  1954. var
  1955.   _ProcessGroupPolicyCompletedEx: Pointer;
  1956. function ProcessGroupPolicyCompletedEx;
  1957. begin
  1958.   GetProcedureAddress(_ProcessGroupPolicyCompletedEx, userenvlib, 'ProcessGroupPolicyCompletedEx');
  1959.   asm
  1960.     mov esp, ebp
  1961.     pop ebp
  1962.     jmp [_ProcessGroupPolicyCompletedEx]
  1963.   end;
  1964. end;
  1965. {$ELSE}
  1966. function ProcessGroupPolicyCompletedEx; external userenvlib name 'ProcessGroupPolicyCompletedEx';
  1967. {$ENDIF DYNAMIC_LINK}
  1968. {$IFDEF DYNAMIC_LINK}
  1969. var
  1970.   _RsopAccessCheckByType: Pointer;
  1971. function RsopAccessCheckByType;
  1972. begin
  1973.   GetProcedureAddress(_RsopAccessCheckByType, userenvlib, 'RsopAccessCheckByType');
  1974.   asm
  1975.     mov esp, ebp
  1976.     pop ebp
  1977.     jmp [_RsopAccessCheckByType]
  1978.   end;
  1979. end;
  1980. {$ELSE}
  1981. function RsopAccessCheckByType; external userenvlib name 'RsopAccessCheckByType';
  1982. {$ENDIF DYNAMIC_LINK}
  1983. {$IFDEF DYNAMIC_LINK}
  1984. var
  1985.   _RsopFileAccessCheck: Pointer;
  1986. function RsopFileAccessCheck;
  1987. begin
  1988.   GetProcedureAddress(_RsopFileAccessCheck, userenvlib, 'RsopFileAccessCheck');
  1989.   asm
  1990.     mov esp, ebp
  1991.     pop ebp
  1992.     jmp [_RsopFileAccessCheck]
  1993.   end;
  1994. end;
  1995. {$ELSE}
  1996. function RsopFileAccessCheck; external userenvlib name 'RsopFileAccessCheck';
  1997. {$ENDIF DYNAMIC_LINK}
  1998. {$IFDEF DYNAMIC_LINK}
  1999. var
  2000.   _RsopSetPolicySettingStatus: Pointer;
  2001. function RsopSetPolicySettingStatus;
  2002. begin
  2003.   GetProcedureAddress(_RsopSetPolicySettingStatus, userenvlib, 'RsopSetPolicySettingStatus');
  2004.   asm
  2005.     mov esp, ebp
  2006.     pop ebp
  2007.     jmp [_RsopSetPolicySettingStatus]
  2008.   end;
  2009. end;
  2010. {$ELSE}
  2011. function RsopSetPolicySettingStatus; external userenvlib name 'RsopSetPolicySettingStatus';
  2012. {$ENDIF DYNAMIC_LINK}
  2013. {$IFDEF DYNAMIC_LINK}
  2014. var
  2015.   _RsopResetPolicySettingStatus: Pointer;
  2016. function RsopResetPolicySettingStatus;
  2017. begin
  2018.   GetProcedureAddress(_RsopResetPolicySettingStatus, userenvlib, 'RsopResetPolicySettingStatus');
  2019.   asm
  2020.     mov esp, ebp
  2021.     pop ebp
  2022.     jmp [_RsopResetPolicySettingStatus]
  2023.   end;
  2024. end;
  2025. {$ELSE}
  2026. function RsopResetPolicySettingStatus; external userenvlib name 'RsopResetPolicySettingStatus';
  2027. {$ENDIF DYNAMIC_LINK}
  2028. end.