Regsys.h
上传用户:xuemeng126
上传日期:2022-07-05
资源大小:454k
文件大小:10k
源码类别:

系统编程

开发平台:

Visual C++

  1. //======================================================================
  2. // 
  3. // Regmon.h
  4. //
  5. // Copyright (C) 1996-2002 Mark Russinovich and Bryce Cogswell
  6. // Sysinternals - wwww.sysinternals.com
  7. //
  8. // This program is protected by copyright. You may not use
  9. // this code or derivatives in commerical or freeware applications
  10. // without a license. Contact licensing@sysinternals.com for inquiries.
  11. //
  12. // Typedefs and defines.
  13. // 
  14. //======================================================================
  15. #define LOGBUFSIZE       ((ULONG)(64*0x400-(3*sizeof(ULONG)+1)))
  16. #if defined(_M_IA64) 
  17. //
  18. // IA64 SYSTEM CALL HOOK/UNHOOK
  19. //
  20. //
  21. // On the IA64 the Zw function has an embedded immediate that is the system call number
  22. //
  23. #define SYSCALL_INDEX(_Function) (((*(PULONG)((PUCHAR)(*(PULONG_PTR)_Function+4)) & 0x3) << 7) + (*(PULONG)((PUCHAR)*(PULONG_PTR)_Function) >> 18))
  24. #define HOOK_SYSCALL(_Function, _Hook, _Orig )  
  25.     if( !HookDescriptors[ SYSCALL_INDEX(_Function) ].Hooked ) { 
  26.             ULONG syscallIndex = SYSCALL_INDEX(_Function ); 
  27.             if( !stubsPatched ) PatchStub( gpReg, (PVOID) *(PULONG_PTR *) Stub##_Hook ); 
  28.             HookDescriptors[ syscallIndex ].FuncDesc.EntryPoint = 
  29.                      (ULONGLONG) InterlockedExchangePointer( (PVOID) &KeServiceTablePointers[ syscallIndex ], *(PULONG_PTR *) Stub##_Hook ); 
  30.             HookDescriptors[ syscallIndex ].FuncDesc.GlobalPointer = ((PLABEL_DESCRIPTOR *)&_Function)->GlobalPointer; 
  31.             _Orig = (PVOID) &HookDescriptors[ syscallIndex ].FuncDesc.EntryPoint; 
  32.             HookDescriptors[ syscallIndex ].Hooked = TRUE; 
  33.     }
  34. //
  35. // NOTE: We can't unhook if someone else has hooked on top of us. Note that the
  36. // unhook code below still has a window of vulnerability where someone can hook between
  37. // our test and unhook.
  38. //
  39. #define UNHOOK_SYSCALL(_Function, _Hook, _Orig )  
  40.     if( HookDescriptors[ SYSCALL_INDEX(_Function)].Hooked && KeServiceTablePointers[ SYSCALL_INDEX(_Function) ] == (PVOID) _Hook ) { 
  41.             InterlockedExchangePointer( (PVOID) &KeServiceTablePointers[ SYSCALL_INDEX(_Function) ], (PVOID) _Orig ); 
  42.             HookDescriptors[ SYSCALL_INDEX(_Function) ].Hooked = FALSE; 
  43.     }
  44. #else
  45. //
  46. // X86 SYSTEM CALL HOOK/UNHOOK
  47. //
  48. //
  49. // Define this because we build with the NT4DDK for 32-bit systems, where
  50. // ULONG_PTR isn't defined and is a ULONG anyway
  51. //
  52. typedef ULONG   ULONG_PTR;
  53. //
  54. // On X86 implementations of Zw* functions, the DWORD
  55. // following the first byte is the system call number, so we reach into the Zw function
  56. // passed as a parameter, and pull the number out. This makes system call hooking
  57. //
  58. #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
  59. #define HOOK_SYSCALL(_Function, _Hook, _Orig )  
  60.     if( !HookDescriptors[ SYSCALL_INDEX(_Function) ].Hooked ) { 
  61.             _Orig = (PVOID) InterlockedExchange( (PLONG) &KeServiceTablePointers[ SYSCALL_INDEX(_Function) ], (LONG) _Hook ); 
  62.             HookDescriptors[ SYSCALL_INDEX(_Function) ].Hooked = TRUE; 
  63.     }
  64. //
  65. // NOTE: We can't unhook if someone else has hooked on top of us. Note that the
  66. // unhook code below still has a window of vulnerability where someone can hook between
  67. // our test and unhook.
  68. //
  69. #define UNHOOK_SYSCALL(_Function, _Hook, _Orig )  
  70.     if( HookDescriptors[ SYSCALL_INDEX(_Function)].Hooked && KeServiceTablePointers[ SYSCALL_INDEX(_Function) ] == (PVOID) _Hook ) { 
  71.             InterlockedExchange( (PLONG) &KeServiceTablePointers[ SYSCALL_INDEX(_Function) ], (LONG) _Orig ); 
  72.             HookDescriptors[ SYSCALL_INDEX(_Function) ].Hooked = FALSE; 
  73.     }
  74. #endif
  75. //
  76. // Number of predefined rootkeys
  77. //
  78. #define NUMROOTKEYS     4
  79. //
  80. // The name of the System process, in which context we're called in our DriverEntry
  81. //
  82. #define SYSNAME         "System"
  83. //
  84. // The maximum length of Registry values that will be copied
  85. //
  86. #define MAXVALLEN      256
  87. //
  88. // Maximum seperate filter components 
  89. //
  90. #define MAXFILTERS     64
  91. //
  92. // The maximum registry path length that will be copied
  93. //
  94. #define MAXPATHLEN     1024
  95. //
  96. // Max len of any error string
  97. //
  98. #define MAXERRORLEN    32
  99. //
  100. // Maximum length of data that will be copied to the "other" field in the display
  101. //
  102. #define MAXDATALEN     64
  103. //
  104. // Length of process name buffer. Process names are at most 16 characters so
  105. // we take into account a trailing NULL.
  106. //
  107. #define MAXPROCNAMELEN  32
  108. //
  109. // Maximum length of NT process name
  110. //
  111. #define NT_PROCNAMELEN  16
  112. //
  113. // Maximum length of root keys that we will produce abbreviations for
  114. //
  115. #define MAXROOTLEN      128
  116. //
  117. // Maximum amount of memory that will be grabbed
  118. //
  119. #define MAXMEM          1000000
  120. //
  121. // Invalid handle
  122. //
  123. #define INVALID_HANDLE_VALUE  ((HANDLE) -1)
  124. //
  125. // Per-user classe key suffix
  126. //
  127. #define USER_CLASSES    "_CLASSES"
  128. //
  129. // System account LUID
  130. //
  131. #define SYSTEMACCOUNT_LOW 999
  132. #define SYSTEMACCOUNT_HIGH 0 
  133. //
  134. // Convenient mutex macros
  135. //
  136. #define MUTEX_INIT(v)      KeInitializeMutex( &v, 0 )
  137. #define MUTEX_ACQUIRE(v)   KeWaitForMutexObject( &v, Executive, KernelMode, FALSE, NULL )
  138. #define MUTEX_RELEASE(v)   KeReleaseMutex( &v, FALSE )
  139. //
  140. // Basic types
  141. //
  142. typedef unsigned int    UINT;
  143. typedef char            CHAR;
  144. typedef char *          PCHAR;
  145. typedef PVOID           POBJECT;
  146. //
  147. // Structure for our name hash table
  148. //
  149. typedef struct _nameentry {
  150.    POBJECT              Object;
  151.    struct _nameentry    *Next;
  152.    CHAR                 FullPathName[];
  153. } HASH_ENTRY, *PHASH_ENTRY;
  154. //
  155. // Structure for keeping linked lists of output buffers
  156. //
  157. typedef struct _log {
  158.     ULONG               Len;
  159.     struct _log *       Next;
  160.     char                Data[ LOGBUFSIZE ];
  161. } LOG_BUF, *PLOG_BUF;
  162. //
  163. // Rootkey name translation structure
  164. //
  165. typedef struct _rootkey {
  166.     CHAR                RootName[256];
  167.     CHAR                RootShort[32];
  168.     ULONG               RootNameLen;
  169. } ROOTKEY, *PROOTKEY;
  170. #if WNET
  171. //
  172. // Pre-to-Post handler tracking structure
  173. //
  174. typedef struct _POST_CONTEXT {
  175.     PVOID               Argument;
  176.     PVOID               Thread;
  177.     PCHAR               FullName;
  178.     LIST_ENTRY          NextContext;
  179. } POST_CONTEXT, *PPOST_CONTEXT;
  180. #endif
  181. //
  182. // Our work item for getting user information
  183. //
  184. typedef struct {
  185.     WORK_QUEUE_ITEM  Item;
  186.     KEVENT           Event;
  187.     LUID             LogonId;
  188.     NTSTATUS         Status;
  189.     PCHAR            Output;
  190.     SecurityUserData UserInformation;
  191. } GETSECINFO_WORK_ITEM, *PGETSECINFO_WORK_ITEM;
  192. //
  193. // Number of hash buckets
  194. //
  195. #define NUMHASH         0x100
  196. #define HASHOBJECT(_regobject)          (ULONG)(((ULONG_PTR)_regobject)>>2)%NUMHASH
  197. //
  198. // Definition for Registry function prototypes not included in NTDDK.H
  199. //
  200. NTSYSAPI
  201. NTSTATUS
  202. NTAPI 
  203. ZwDeleteValueKey( 
  204.     IN HANDLE, 
  205.     IN PUNICODE_STRING 
  206.     );
  207. NTSYSAPI
  208. NTSTATUS
  209. NTAPI 
  210. ZwLoadKey( 
  211.     IN POBJECT_ATTRIBUTES, 
  212.     IN POBJECT_ATTRIBUTES 
  213.     );
  214. NTSYSAPI
  215. NTSTATUS
  216. NTAPI 
  217. ZwUnloadKey( 
  218.     IN POBJECT_ATTRIBUTES 
  219.     );
  220. //
  221. // Definition for ObQueryNameString call
  222. //
  223. // 
  224. NTSTATUS
  225. NTAPI 
  226. ObQueryNameString( 
  227.     POBJECT Object, 
  228.     PUNICODE_STRING Name, 
  229.     ULONG MaximumLength, 
  230.     PULONG ActualLength 
  231.     );
  232. NTSYSAPI
  233. NTSTATUS
  234. NTAPI 
  235. ObOpenObjectByPointer( 
  236.     POBJECT Object, 
  237.     ULONG HandleAttributes, 
  238.     PACCESS_STATE PassedAccessState, 
  239.     ACCESS_MASK DesiredAccess, 
  240.     POBJECT_TYPE ObjectType, 
  241.     KPROCESSOR_MODE AccessMode, 
  242.     HANDLE *Handle 
  243.     );
  244. //
  245. // For displaying messages to the Blue Screen
  246. //
  247. NTSYSAPI
  248. NTSTATUS
  249. NTAPI 
  250. ZwDisplayString( 
  251.     PUNICODE_STRING Text 
  252.     );
  253. //
  254. // Definition for a call we get passed the index for from user space
  255. //
  256. // NTSTATUS 
  257. // NTAPI
  258. // ZwQueryInformationToken (
  259. //     HANDLE TokenHandle,
  260. //     TOKEN_INFORMATION_CLASS TokenInformationClass,
  261. //     PVOID TokenInformation,
  262. //     ULONG TokenInformationLength,
  263. //     PULONG ReturnLength 
  264. //     );
  265. #if !defined(_M_IA64) && !defined(WNET)
  266. //
  267. // Undocumented ntoskrnl function for checking user buffer validity
  268. //
  269. // VOID 
  270. // NTAPI 
  271. // ProbeForWrite(
  272. //     PVOID Address, 
  273. //     ULONG Length, 
  274. //     ULONG Alignment 
  275. //     );
  276. //
  277. // This are Win2K definitions that are included only in the Win2K
  278. // version of NTDDK.H. So that it works on NT 4, Regmon is built with
  279. // the NT 4 DDK and we have to include these definitions ourselves
  280. //
  281. // enum {
  282. //     KeyNameInformation = 3,
  283. //     KeyCachedInformation,
  284. //     KeyFlagsInformation
  285. // };
  286. // 
  287. // enum {
  288. //     KeyUserFlagsInformation = 1
  289. // };
  290. // typedef struct _KEY_USER_FLAGS_INFORMATION {
  291. //     ULONG   UserFlags;
  292. // } KEY_USER_FLAGS_INFORMATION, *PKEY_USER_FLAGS_INFORMATION;
  293. // typedef struct _KEY_NAME_INFORMATION {
  294. //     ULONG   NameLength;
  295. //     WCHAR   Name[1];            // Variable length string
  296. // } KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION;
  297. // typedef struct _KEY_CACHED_INFORMATION {
  298. //     LARGE_INTEGER LastWriteTime;
  299. //     ULONG   TitleIndex;
  300. //     ULONG   SubKeys;
  301. //     ULONG   MaxNameLen;
  302. //     ULONG   Values;
  303. //     ULONG   MaxValueNameLen;
  304. //     ULONG   MaxValueDataLen;
  305. //     ULONG   NameLength;
  306. //     WCHAR   Name[1];            // Variable length string
  307. // } KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION;
  308. // typedef struct _KEY_FLAGS_INFORMATION {
  309. //     ULONG   UserFlags;
  310. // } KEY_FLAGS_INFORMATION, *PKEY_FLAGS_INFORMATION;
  311. #endif
  312. //
  313. // Extract transfer type
  314. //
  315. #define IOCTL_TRANSFER_TYPE( _iocontrol)   (_iocontrol & 0x3)