NtApi.h
上传用户:kittypts
上传日期:2018-02-11
资源大小:241k
文件大小:5k
源码类别:

PlugIns编程

开发平台:

Visual C++

  1. #ifndef _NTAPI_H_
  2. #define _NTAPI_H_
  3. /**
  4. Define use of WinNT from W2K
  5. */
  6. #ifndef _WIN32_WINNT
  7. #define _WIN32_WINNT 0x0500
  8. #else
  9. #if (_WIN32_WINNT < 0x0500)
  10. #pragma message(__FILE__ "Warning: WIN32_WINNT flag redifined to 0x0500.")
  11. #undef _WIN32_WINNT
  12. #define _WIN32_WINNT 0x0500
  13. #endif // _WIN32_WINNT
  14. #endif
  15. #include <WTypes.h>
  16. #include <winternl.h>
  17. /**
  18. Raw call to functions in ntdll
  19. PANSI_STRING needs WINVER >= 0x0500 //Windows 2000
  20. */
  21. class NktNtApi
  22. {
  23. friend class NktNtApiInitializer;
  24. public:
  25. typedef enum _EVENT_TYPE
  26. {
  27. NotificationEvent,
  28. SynchronizationEvent
  29. } EVENT_TYPE, *PEVENT_TYPE;
  30. // NTDLL API Declarations:
  31. typedef void (NTAPI *NtSuspendThread)(IN HANDLE ThreadHandle, OUT PULONG PreviousSuspendCount OPTIONAL );
  32. typedef void (__cdecl *DbgPrint)(IN LPCSTR Format, ... );
  33. typedef void (NTAPI *LdrGetProcedureAddress)(IN HMODULE ModuleHandle, IN PANSI_STRING FunctionName OPTIONAL, IN WORD Oridinal OPTIONAL, OUT PVOID *FunctionAddress );
  34. typedef void (NTAPI *RtlInitAnsiString)(PANSI_STRING DestinationString, PCSZ SourceString);
  35. typedef void (NTAPI *RtlInitUnicodeString)(PUNICODE_STRING DestinationString, PCWSTR SourceString);
  36. typedef PTEB (NTAPI *NtCurrentTeb)(void);
  37. typedef NTSTATUS (NTAPI *NtSetEvent)(IN HANDLE, OUT PLONG prevState);
  38. typedef NTSTATUS (NTAPI *NtResetEvent)(IN HANDLE, OUT PLONG prevState);
  39. typedef NTSTATUS (NTAPI *NtPulseEvent)(IN HANDLE, OUT PLONG prevState);
  40. typedef NTSTATUS (NTAPI *NtClose)(IN HANDLE Handle);
  41. typedef NTSTATUS (NTAPI *NtCreateEvent)(OUT PHANDLE EventHandle,
  42. IN ACCESS_MASK DesiredAccess,
  43. IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
  44. IN EVENT_TYPE EventType,
  45. IN BOOLEAN InitialState);
  46. typedef NTSTATUS (NTAPI *NtOpenEvent)(OUT PHANDLE EventHandle,
  47.   IN ACCESS_MASK DesiredAccess,
  48.   IN POBJECT_ATTRIBUTES ObjectAttributes);
  49. typedef NTSTATUS (NTAPI *NtQueryInformationThread)(IN HANDLE ThreadHandle,
  50.    IN THREADINFOCLASS ThreadInformationClass,
  51.    OUT PVOID ThreadInformation,
  52.    IN ULONG ThreadInformationLength,
  53.    OUT PULONG ReturnLength OPTIONAL);
  54. typedef NTSTATUS (NTAPI *NtLdrGetDllHandle) (IN PWORD pwPath OPTIONAL,
  55.  IN PVOID Unused OPTIONAL,
  56.  IN PUNICODE_STRING ModuleFileName,
  57.  OUT PHANDLE pHModule);
  58. public:
  59. /**
  60. Suspend requested thread.
  61. */
  62. static void SuspendThread(HANDLE hthread);
  63. /**
  64. Print debug message.
  65. */
  66. static void DebugPrint(IN LPCSTR msg, ...);
  67. /**
  68. Get Procedure address.
  69. */
  70. static FARPROC GetProcAddress(IN HMODULE hModule, IN LPCSTR lpProcName);
  71. /**
  72. Get inproc module handle.
  73. */
  74. static HMODULE RawGetModuleHandle(IN LPCWSTR lpModuleName);
  75. static HMODULE RawGetModuleHandle(IN LPCSTR lpModuleName);
  76. /**
  77. Get TEB Structure for calling thread.
  78. */
  79. static PTEB CurrentTEB();
  80. /**
  81. Gets pointer to the TEB structure of any thread.
  82. */
  83. static PTEB GetThreadTEB(DWORD tid);
  84. /**
  85. Get ID for calling thread.
  86. */
  87. static DWORD GetCurrentThreadId();
  88. /**
  89. Get ID for calling process.
  90. */
  91. static DWORD GetCurrentProcessId();
  92. /**
  93. Get Paging size.
  94. */
  95. static DWORD GetPageSize();
  96. /**
  97. Win32 event's functions.
  98. */
  99. //Name MUST be in the form of "BaseNamedObjects<name>"
  100. static HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
  101.   BOOL bManualReset,
  102.   BOOL bInitialState,
  103.   LPCSTR lpName);
  104. static HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
  105.   BOOL bManualReset,
  106.   BOOL bInitialState,
  107.   LPCWSTR lpName);
  108. static HANDLE OpenEvent(DWORD dwDesiredAccess, 
  109. BOOL bInheritHandle,
  110. LPCSTR lpName);
  111. static HANDLE OpenEvent(DWORD dwDesiredAccess, 
  112. BOOL bInheritHandle,
  113. LPCWSTR lpName);
  114. static BOOL SetEvent(IN HANDLE);
  115. static BOOL ResetEvent(IN HANDLE);
  116. static BOOL PulseEvent(IN HANDLE);
  117. /**
  118. CloseHandle.
  119. WARNING: This will call NtClose, which is not suitable for *ANY* handle.
  120. */
  121. static BOOL CloseHandle(HANDLE h);
  122. protected:
  123. /**
  124. Internal initializer.
  125. */
  126. static void Initialize();
  127. protected:
  128. static DbgPrint dbgPrint;
  129. static NtSuspendThread suspendThread;
  130. static LdrGetProcedureAddress getProcAddress;
  131. static RtlInitAnsiString initAnsiString;
  132. static RtlInitUnicodeString initUnicodeString;
  133. static NtCurrentTeb ntCurrentTeb;
  134. static NtSetEvent ntSetEvent;
  135. static NtResetEvent ntResetEvent;
  136. static NtPulseEvent ntPulseEvent;
  137. static NtClose ntClose;
  138. static NtCreateEvent ntCreateEvent;
  139. static NtOpenEvent ntOpenEvent;
  140. static NtQueryInformationThread ntQueryInformationThread;
  141. static NtLdrGetDllHandle ntLdrGetDllHandle;
  142. static SYSTEM_INFO systemInfo;
  143. static bool initialized;
  144. };
  145. #endif // _NTAPI_H_