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.

163 lines
4.4 KiB

  1. #include "gptext.h"
  2. #include <initguid.h>
  3. #include <devioctl.h>
  4. #include <strsafe.h>
  5. #define GPEXT_PATH TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions\\{426031c0-0b47-4852-b0ca-ac3d37bfcb39}")
  6. #define DriverName TEXT("\\\\.\\PSCHED")
  7. #define IOCTL_PSCHED_ZAW_EVENT CTL_CODE( \
  8. FILE_DEVICE_NETWORK, \
  9. 20, \
  10. METHOD_BUFFERED, \
  11. FILE_ANY_ACCESS \
  12. )
  13. HRESULT
  14. RegisterPSCHED(void)
  15. {
  16. HKEY hKey;
  17. LONG lResult;
  18. DWORD dwDisp, dwValue;
  19. TCHAR szBuffer[512];
  20. lResult = RegCreateKeyEx (
  21. HKEY_LOCAL_MACHINE,
  22. GPEXT_PATH,
  23. 0,
  24. NULL,
  25. REG_OPTION_NON_VOLATILE,
  26. KEY_WRITE,
  27. NULL,
  28. &hKey,
  29. &dwDisp
  30. );
  31. if (lResult != ERROR_SUCCESS)
  32. {
  33. return lResult;
  34. }
  35. LoadString (g_hInstance, IDS_PSCHED_NAME, szBuffer, ARRAYSIZE(szBuffer));
  36. RegSetValueEx (
  37. hKey,
  38. NULL,
  39. 0,
  40. REG_SZ,
  41. (LPBYTE)szBuffer,
  42. (lstrlen(szBuffer) + 1) * sizeof(TCHAR)
  43. );
  44. RegSetValueEx (
  45. hKey,
  46. TEXT("ProcessGroupPolicy"),
  47. 0,
  48. REG_SZ,
  49. (LPBYTE)TEXT("ProcessPSCHEDPolicy"),
  50. (lstrlen(TEXT("ProcessPSCHEDPolicy")) + 1) * sizeof(TCHAR)
  51. );
  52. szBuffer[0] = L'\0';
  53. (void) StringCchCopy(szBuffer, ARRAYSIZE(szBuffer), L"gptext.dll");
  54. RegSetValueEx (
  55. hKey,
  56. TEXT("DllName"),
  57. 0,
  58. REG_EXPAND_SZ,
  59. (LPBYTE)szBuffer,
  60. (lstrlen(szBuffer) + 1) * sizeof(TCHAR)
  61. );
  62. dwValue = 1;
  63. RegSetValueEx (
  64. hKey,
  65. TEXT("NoUserPolicy"),
  66. 0,
  67. REG_DWORD,
  68. (LPBYTE)&dwValue,
  69. sizeof(dwValue));
  70. RegSetValueEx (
  71. hKey,
  72. TEXT("NoGPOListChanges"),
  73. 0,
  74. REG_DWORD,
  75. (LPBYTE)&dwValue,
  76. sizeof(dwValue));
  77. RegCloseKey (hKey);
  78. return S_OK;
  79. }
  80. HRESULT
  81. UnregisterPSCHED(void)
  82. {
  83. RegDeleteKey (HKEY_LOCAL_MACHINE, GPEXT_PATH);
  84. return S_OK;
  85. }
  86. VOID
  87. PingPsched()
  88. {
  89. HANDLE PschedDriverHandle;
  90. ULONG BytesReturned;
  91. BOOL IOStatus;
  92. PschedDriverHandle = CreateFile(
  93. DriverName,
  94. GENERIC_READ | GENERIC_WRITE,
  95. FILE_SHARE_READ | FILE_SHARE_WRITE,
  96. NULL,
  97. OPEN_EXISTING,
  98. FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
  99. NULL
  100. );
  101. if (PschedDriverHandle != INVALID_HANDLE_VALUE) {
  102. IOStatus = DeviceIoControl(
  103. PschedDriverHandle,
  104. IOCTL_PSCHED_ZAW_EVENT,
  105. NULL,
  106. 0,
  107. NULL,
  108. 0,
  109. &BytesReturned,
  110. NULL
  111. );
  112. CloseHandle(PschedDriverHandle);
  113. }
  114. }
  115. DWORD WINAPI
  116. ProcessPSCHEDPolicy(
  117. IN DWORD dwFlags, // GPO_INFO_FLAGS
  118. IN HANDLE hToken, // User or machine token
  119. IN HKEY hKeyRoot, // Root of registry
  120. IN PGROUP_POLICY_OBJECT pDeletedGPOList, // Linked list of deleted GPOs
  121. IN PGROUP_POLICY_OBJECT pChangedGPOList, // Linked list of changed GPOs
  122. IN ASYNCCOMPLETIONHANDLE pHandle, // For asynchronous completion
  123. IN BOOL *pbAbort, // If true, then abort GPO processing
  124. IN PFNSTATUSMESSAGECALLBACK pStatusCallback // Callback function for displaying status messages
  125. )
  126. {
  127. HRESULT hr = S_OK;
  128. if (pDeletedGPOList || pChangedGPOList)
  129. {
  130. PingPsched();
  131. }
  132. return(ERROR_SUCCESS);
  133. }