├── .gitignore ├── MSBuild └── v4.0 │ ├── Microsoft.Cpp.Win32.user.props │ ├── Microsoft.Cpp.arm64.user.props │ └── Microsoft.Cpp.x64.user.props ├── README.md ├── SkipPsNotify ├── .manifest ├── .rc ├── .rc2 ├── SkipPsNotify.vcxproj ├── SkipPsNotify.vcxproj.filters ├── SkipPsNotify.vcxproj.user ├── ep.cpp ├── regedit.ico ├── resource.h ├── stdafx.cpp └── stdafx.h ├── Solution.sln ├── pnth ├── .gitattributes ├── mini_yvals.h ├── ntbcd.h ├── ntdbg.h ├── ntexapi.h ├── ntgdi.h ├── ntioapi.h ├── ntkeapi.h ├── ntldr.h ├── ntlpcapi.h ├── ntmisc.h ├── ntmmapi.h ├── ntnls.h ├── ntobapi.h ├── ntpebteb.h ├── ntpfapi.h ├── ntpnpapi.h ├── ntpoapi.h ├── ntpsapi.h ├── ntregapi.h ├── ntrtl.h ├── ntsam.h ├── ntseapi.h ├── ntsmss.h ├── nttmapi.h ├── nttp.h ├── ntwow64.h ├── ntxcapi.h ├── ntzwapi.h ├── pch.h ├── phnt.h ├── phnt_ntdef.h ├── phnt_windows.h ├── rtlframe.h ├── subprocesstag.h └── winsta.h ├── src ├── .manifest ├── .rc2 ├── Clone.rc ├── Clone.vcxproj ├── Clone.vcxproj.filters ├── Clone.vcxproj.user ├── FileName.cpp ├── regedit.ico ├── resource.h ├── stdafx.cpp └── stdafx.h └── x64 └── Release ├── Clone.exe └── SkipPsNotify.exe /.gitignore: -------------------------------------------------------------------------------- 1 | .vs 2 | *.pdb 3 | tmp 4 | *.obj 5 | *.lib 6 | *.exp 7 | *.aps 8 | -------------------------------------------------------------------------------- /MSBuild/v4.0/Microsoft.Cpp.Win32.user.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(WindowsSdkDir)Include\$(TargetPlatformVersion)\ 5 | $(WindowsSdkDir)Lib\$(TargetPlatformVersion)\ 6 | 7 | 8 | $(INC_ROOT)shared;$(INC_ROOT)km;$(INC_ROOT)um;$(INC_ROOT)km\crt 9 | $(LIB_ROOT)km\x86;$(LIB_ROOT)um\x86;$(LIB_ROOT)ucrt\x86 10 | $(SolutionDir)tmp\$(Platform)\$(Configuration)\$(ProjectName)\ 11 | false 12 | false 13 | false 14 | 15 | 16 | 17 | BufferOverflow.lib;ntdllp.lib;kernel32.lib;user32.lib;advapi32.lib 18 | true 19 | false 20 | "$(OutDir)" 21 | true 22 | UseLinkTimeCodeGeneration 23 | true 24 | MachineX86 25 | 26 | 27 | Level4 28 | Classic 29 | Size 30 | true 31 | false 32 | true 33 | false 34 | true 35 | stdcpplatest 36 | Use 37 | StdCall 38 | true 39 | true 40 | true 41 | false 42 | 43 | 44 | 45 | 46 | $(LIB_ROOT) 47 | 48 | 49 | $(INC_ROOT) 50 | 51 | 52 | -------------------------------------------------------------------------------- /MSBuild/v4.0/Microsoft.Cpp.arm64.user.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(WindowsSdkDir)Include\$(TargetPlatformVersion)\ 5 | $(WindowsSdkDir)Lib\$(TargetPlatformVersion)\ 6 | 7 | 8 | $(INC_ROOT)shared;$(INC_ROOT)km;$(INC_ROOT)um;$(INC_ROOT)km\crt 9 | $(LIB_ROOT)km\arm64;$(LIB_ROOT)um\arm64;$(LIB_ROOT)ucrt\arm64 10 | $(SolutionDir)tmp\$(Platform)\$(Configuration)\$(ProjectName)\ 11 | false 12 | false 13 | false 14 | 15 | 16 | 17 | BufferOverflow.lib;ntdllp.lib;kernel32.lib;advapi32.lib;user32.lib 18 | true 19 | false 20 | "$(OutDir)" 21 | true 22 | UseLinkTimeCodeGeneration 23 | MachineARM64 24 | 25 | 26 | Level4 27 | Classic 28 | Size 29 | true 30 | false 31 | true 32 | false 33 | true 34 | stdcpplatest 35 | Use 36 | StdCall 37 | true 38 | true 39 | true 40 | false 41 | 42 | 43 | 44 | 45 | $(LIB_ROOT) 46 | 47 | 48 | $(INC_ROOT) 49 | 50 | 51 | -------------------------------------------------------------------------------- /MSBuild/v4.0/Microsoft.Cpp.x64.user.props: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | $(WindowsSdkDir)Include\$(TargetPlatformVersion)\ 5 | $(WindowsSdkDir)Lib\$(TargetPlatformVersion)\ 6 | 7 | 8 | $(INC_ROOT)shared;$(INC_ROOT)km;$(INC_ROOT)um;$(INC_ROOT)km\crt 9 | $(LIB_ROOT)km\x64;$(LIB_ROOT)um\x64;$(LIB_ROOT)ucrt\x64 10 | $(SolutionDir)tmp\$(Platform)\$(Configuration)\$(ProjectName)\ 11 | false 12 | false 13 | false 14 | 15 | 16 | 17 | BufferOverflow.lib;ntdllp.lib;kernel32.lib;advapi32.lib;user32.lib 18 | true 19 | false 20 | "$(OutDir)" 21 | true 22 | UseLinkTimeCodeGeneration 23 | MachineX64 24 | 25 | 26 | Level4 27 | Classic 28 | Size 29 | true 30 | false 31 | true 32 | false 33 | true 34 | stdcpplatest 35 | Use 36 | StdCall 37 | true 38 | true 39 | true 40 | false 41 | 42 | 43 | 44 | 45 | $(LIB_ROOT) 46 | 47 | 48 | $(INC_ROOT) 49 | 50 | 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RtlClone 2 | 3 | from [The Definitive Guide To Process Cloning on Windows](https://github.com/huntandhackett/process-cloning/tree/master?tab=readme-ov-file#the-definitive-guide-to-process-cloning-on-windows) 4 | 5 | >So, why is `RtlCloneUserProcess` useful when we already have the more flexible `NtCreateUserProcess` ? 6 | >The reason might be surprising: we cannot re-implement its functionality, at least not entirely and precisely. 7 | 8 | this is not true. ntdll.dll (x64, but not x86, not check on arm64) exported next 2 functions: 9 | 10 | ``` 11 | NTSYSAPI 12 | NTSTATUS 13 | NTAPI 14 | RtlPrepareForProcessCloning(); 15 | 16 | NTSYSAPI 17 | NTSTATUS 18 | NTAPI 19 | RtlCompleteProcessCloning(_In_ BOOL bCloned); 20 | ``` 21 | 22 | with it we easy can implement `RtlCloneUserProcess` with `NtCreateUserProcess` 23 | 24 | ``` 25 | NTSTATUS status = ProcessFlags & RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE 26 | ? STATUS_SUCCESS : RtlPrepareForProcessCloning(); 27 | 28 | if (0 <= status) 29 | { 30 | PS_CREATE_INFO createInfo = { sizeof(createInfo) }; 31 | 32 | status = NtCreateUserProcess(...); 33 | 34 | if (ProcessFlags & RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE) 35 | RtlCompleteProcessCloning(STATUS_PROCESS_CLONED == status); 36 | } 37 | 38 | return status; 39 | ``` 40 | 41 | such implementation we can view in `wow64.dll` inside `Wow64NtCreateUserProcess` function 42 | 43 | probably it doesn't matter more, but it seems these api ( `RtlPrepareForProcessCloning` / `RtlCompleteProcessCloning` ) almost unknown, despite exist from win 8.1 (or 8) 44 | 45 | in src code several example of how cloned process can interact with parent - via inherited Event handle, thread Alert, Apc, etc 46 | also i show here again how we can map/unmap executable image section from cloned process to parent process. this is very strong anti-debug technique, most debuggers freeze both processes here forever. some debuggers silently, windbg with next messages: 47 | 48 | ``` 49 | // ERROR: Unable to find system process **** 50 | // ERROR: The process being debugged has either exited or cannot be accessed 51 | // ERROR: Many commands will not work properly 52 | // ERROR: Module load event for unknown process 53 | ``` 54 | also this is work in x64 processes. but in x86 not exist RtlPrepareForProcessCloning/RtlCompleteProcessCloning 55 | 56 | in case we in wow64 (x86 process on x64 system) `NtCreateUserProcess` internal call `Wow64NtCreateUserProcess` function inside `wow64.dll` 57 | and it already call `RtlPrepareForProcessCloning();NtCreateUserProcess(...);RtlCompleteProcessCloning(STATUS_PROCESS_CLONED == status);` ( if `RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE` not set ) 58 | despite new cloned wow64 process created - it crashed just after enter to 32-bit mode. more exactly - after first access **`FS`** segment. in x86 windows **`FS`** segment must point to thread *TEB*, but by error in cloning code - **`FS`** point to 0 in cloned process 59 | -------------------------------------------------------------------------------- /SkipPsNotify/.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | True 21 | true 22 | 23 | 24 | -------------------------------------------------------------------------------- /SkipPsNotify/.rc: -------------------------------------------------------------------------------- 1 | // Microsoft Visual C++ generated resource script. 2 | // 3 | #include "resource.h" 4 | 5 | #define APSTUDIO_READONLY_SYMBOLS 6 | ///////////////////////////////////////////////////////////////////////////// 7 | // 8 | // Generated from the TEXTINCLUDE 2 resource. 9 | // 10 | #include "winres.h" 11 | ///////////////////////////////////////////////////////////////////////////// 12 | #undef APSTUDIO_READONLY_SYMBOLS 13 | 14 | ///////////////////////////////////////////////////////////////////////////// 15 | // English (U.S.) resources 16 | 17 | #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) 18 | #ifdef _WIN32 19 | LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US 20 | #pragma code_page(1252) 21 | #endif //_WIN32 22 | 23 | #ifdef APSTUDIO_INVOKED 24 | ///////////////////////////////////////////////////////////////////////////// 25 | // 26 | // TEXTINCLUDE 27 | // 28 | 29 | 1 TEXTINCLUDE 30 | BEGIN 31 | "resource.h\0" 32 | END 33 | 34 | 2 TEXTINCLUDE 35 | BEGIN 36 | "#include ""winres.h\0" 37 | END 38 | 39 | 3 TEXTINCLUDE 40 | BEGIN 41 | "#include "".rc2\0" 42 | END 43 | 44 | #endif // APSTUDIO_INVOKED 45 | 46 | 47 | #endif // English (U.S.) resources 48 | ///////////////////////////////////////////////////////////////////////////// 49 | 50 | 51 | #ifndef APSTUDIO_INVOKED 52 | ///////////////////////////////////////////////////////////////////////////// 53 | // 54 | // Generated from the TEXTINCLUDE 3 resource. 55 | // 56 | #include ".rc2" 57 | ///////////////////////////////////////////////////////////////////////////// 58 | #endif // not APSTUDIO_INVOKED 59 | 60 | -------------------------------------------------------------------------------- /SkipPsNotify/.rc2: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////// 2 | // 3 | // RT_MANIFEST 4 | // 5 | LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 6 | 7 | CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ".manifest" 8 | 9 | 1 ICON "regedit.ico" 10 | -------------------------------------------------------------------------------- /SkipPsNotify/SkipPsNotify.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | Win32 7 | 8 | 9 | Release 10 | x64 11 | 12 | 13 | 14 | 16.0 15 | Win32Proj 16 | {983067F0-c52a-5216-A233-AEFCF52D77DC} 17 | SkipPsNotify 18 | 10.0 19 | $(SolutionDir)MSBuild\v4.0 20 | 21 | 22 | 23 | Application 24 | false 25 | v143 26 | Unicode 27 | true 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | Level4 36 | true 37 | MaxSpeed 38 | $(SolutionDir)pnth 39 | 40 | 41 | Windows 42 | true 43 | true 44 | false 45 | ep 46 | /EMITPOGOPHASEINFO /EMITVOLATILEMETADATA:NO %(AdditionalOptions) 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | Create 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /SkipPsNotify/SkipPsNotify.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | Header Files 31 | 32 | 33 | 34 | 35 | Resource Files 36 | 37 | 38 | 39 | 40 | Resource Files 41 | 42 | 43 | -------------------------------------------------------------------------------- /SkipPsNotify/SkipPsNotify.vcxproj.user: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /SkipPsNotify/ep.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | 3 | EXTERN_C_START 4 | 5 | NTSYSAPI 6 | NTSTATUS 7 | NTAPI 8 | RtlPrepareForProcessCloning(); 9 | 10 | NTSYSAPI 11 | NTSTATUS 12 | NTAPI 13 | RtlCompleteProcessCloning(_In_ BOOL bCloned); 14 | 15 | EXTERN_C_END 16 | 17 | NTSTATUS CloneUserProcess(_Out_ PHANDLE ProcessHandle, 18 | _Out_ PHANDLE ThreadHandle, 19 | _In_ BOOL bSynchronize, 20 | _In_ ULONG ProcessFlags, // PROCESS_CREATE_FLAGS_* 21 | _In_ ULONG ThreadFlags // THREAD_CREATE_FLAGS_* 22 | ) 23 | { 24 | NTSTATUS status = bSynchronize ? RtlPrepareForProcessCloning() : STATUS_SUCCESS; 25 | 26 | if (0 <= status) 27 | { 28 | PS_CREATE_INFO createInfo = { sizeof(createInfo) }; 29 | 30 | status = NtCreateUserProcess(ProcessHandle, 31 | ThreadHandle, PROCESS_ALL_ACCESS, THREAD_ALL_ACCESS, NULL, NULL, 32 | ProcessFlags, ThreadFlags, NULL, &createInfo, NULL); 33 | 34 | if (IsDebuggerPresent()) __debugbreak(); 35 | 36 | if (bSynchronize) RtlCompleteProcessCloning(STATUS_PROCESS_CLONED == status); 37 | } 38 | 39 | return status; 40 | } 41 | 42 | NTSTATUS CreateSection(_Out_ PHANDLE SectionHandle, _In_ PCWSTR lpLibFileName) 43 | { 44 | int len = 0; 45 | PWSTR buf = 0; 46 | 47 | while (0 < (len = _snwprintf(buf, len, L"\\systemroot\\system32\\%s", lpLibFileName))) 48 | { 49 | if (buf) 50 | { 51 | UNICODE_STRING ObjectName; 52 | OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, &ObjectName, OBJ_CASE_INSENSITIVE }; 53 | RtlInitUnicodeString(&ObjectName, buf); 54 | 55 | HANDLE hFile; 56 | IO_STATUS_BLOCK iosb; 57 | NTSTATUS status = NtOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); 58 | 59 | if (0 <= status) 60 | { 61 | status = NtCreateSection(SectionHandle, SECTION_MAP_EXECUTE, 0, 0, PAGE_EXECUTE, SEC_IMAGE, hFile); 62 | NtClose(hFile); 63 | } 64 | 65 | return status; 66 | } 67 | 68 | buf = (PWSTR)alloca(++len * sizeof(WCHAR)); 69 | } 70 | 71 | return STATUS_INTERNAL_ERROR; 72 | } 73 | 74 | struct BAS { 75 | PVOID BaseAddress; 76 | NTSTATUS status; 77 | }; 78 | 79 | void NTAPI OnApc( 80 | _In_opt_ PVOID ApcArgument1, 81 | _In_opt_ PVOID ApcArgument2, 82 | _In_opt_ PVOID ApcArgument3) 83 | { 84 | reinterpret_cast(ApcArgument1)->BaseAddress = ApcArgument2; 85 | reinterpret_cast(ApcArgument1)->status = (NTSTATUS)(ULONG_PTR)ApcArgument3; 86 | } 87 | 88 | NTSTATUS NotifyParent(_In_ HANDLE hThread, _In_ PVOID BaseAddress, _In_ BAS* p, NTSTATUS status) 89 | { 90 | return NtQueueApcThread(hThread, OnApc, p, BaseAddress, (PVOID)(ULONG_PTR)status); 91 | } 92 | 93 | NTSTATUS DoRemoteMap( 94 | _In_ PCWSTR lpLibFileName, 95 | _In_ PCLIENT_ID ClientId, 96 | _In_ HANDLE hThread, 97 | _In_ BAS* p) 98 | { 99 | HANDLE hProcess, hSection; 100 | 101 | BOOL bPost = FALSE; 102 | 103 | NTSTATUS status; 104 | 105 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 106 | 107 | if (0 <= (status = NtOpenProcess(&hProcess, PROCESS_VM_OPERATION, &oa, ClientId))) 108 | { 109 | if (0 <= (status = CreateSection(&hSection, lpLibFileName))) 110 | { 111 | SIZE_T ViewSize = 0; 112 | PVOID BaseAddress = 0; 113 | 114 | ////////////////////////////////////////////////////////////////////////// 115 | // 116 | // ERROR: Unable to find system process **** 117 | // ERROR: The process being debugged has either exited or cannot be accessed 118 | // ERROR: Many commands will not work properly 119 | // ERROR: Module load event for unknown process 120 | // 121 | ////////////////////////////////////////////////////////////////////////// 122 | 123 | status = ZwMapViewOfSection(hSection, hProcess, &BaseAddress, 124 | 0, 0, 0, &ViewSize, ViewShare, 0, PAGE_EXECUTE); 125 | 126 | NtClose(hSection); 127 | 128 | if (0 <= status) 129 | { 130 | bPost = TRUE; 131 | 132 | if (0 > (status = NotifyParent(hThread, BaseAddress, p, status))) 133 | { 134 | ZwUnmapViewOfSection(hProcess, BaseAddress); 135 | } 136 | } 137 | } 138 | 139 | NtClose(hProcess); 140 | } 141 | 142 | if (!bPost) NotifyParent(hThread, 0, p, status); 143 | 144 | return status; 145 | } 146 | 147 | NTSTATUS DoRemoteUnMap( 148 | _In_ PVOID BaseAddress, 149 | _In_ PCLIENT_ID ClientId, 150 | _In_ HANDLE hThread, 151 | _In_ BAS* p) 152 | { 153 | HANDLE hProcess; 154 | 155 | NTSTATUS status; 156 | 157 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 158 | 159 | if (0 <= (status = NtOpenProcess(&hProcess, PROCESS_VM_OPERATION, &oa, ClientId))) 160 | { 161 | status = ZwUnmapViewOfSection(hProcess, BaseAddress); 162 | 163 | NtClose(hProcess); 164 | } 165 | 166 | NotifyParent(hThread, BaseAddress, p, status); 167 | 168 | return status; 169 | } 170 | 171 | NTSTATUS OpenParentThread(_Out_ PHANDLE ThreadHandle, 172 | _In_ ACCESS_MASK DesiredAccess, 173 | _In_ PCLIENT_ID ClientId) 174 | /* 175 | thread with ClientId must be created *before* current thread 176 | */ 177 | { 178 | NTSTATUS status; 179 | KERNEL_USER_TIMES kut, my_kut; 180 | 181 | if (0 <= (status = NtQueryInformationThread(NtCurrentThread(), ThreadTimes, &my_kut, sizeof(my_kut), 0))) 182 | { 183 | HANDLE hThread; 184 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 185 | 186 | if (0 <= (status = NtOpenThread(&hThread, DesiredAccess | THREAD_QUERY_LIMITED_INFORMATION, &oa, ClientId))) 187 | { 188 | if (0 <= (status = NtQueryInformationThread(hThread, ThreadTimes, &kut, sizeof(kut), 0))) 189 | { 190 | if (kut.CreateTime.QuadPart <= my_kut.CreateTime.QuadPart) 191 | { 192 | *ThreadHandle = hThread; 193 | return STATUS_SUCCESS; 194 | } 195 | 196 | // original thread terminated and other thread reuse it id 197 | status = STATUS_INVALID_CID; 198 | } 199 | 200 | NtClose(hThread); 201 | } 202 | } 203 | 204 | return status; 205 | } 206 | 207 | NTSTATUS fork(_Out_ void** phmod, _In_ PCWSTR lpLibFileName = 0, _In_ PVOID BaseAddress = 0) 208 | { 209 | HANDLE hProcess, hThread; 210 | 211 | BAS ba{ 0, STATUS_UNSUCCESSFUL }; 212 | 213 | CLIENT_ID cid = { (HANDLE)(ULONG_PTR)GetCurrentProcessId(), (HANDLE)(ULONG_PTR)GetCurrentThreadId() }; 214 | 215 | NTSTATUS status = CloneUserProcess(&hProcess, &hThread, TRUE, 0, 0); 216 | 217 | if (STATUS_PROCESS_CLONED == status) 218 | { 219 | // ++ cloned process 220 | 221 | if (0 <= (status = OpenParentThread(&hThread, THREAD_ALERT | THREAD_SET_CONTEXT, &cid))) 222 | { 223 | status = BaseAddress ? DoRemoteUnMap(BaseAddress, &cid, hThread, &ba) : 224 | lpLibFileName ? DoRemoteMap(lpLibFileName, &cid, hThread, &ba) : NtAlertThread(hThread); 225 | 226 | NtClose(hThread); 227 | } 228 | 229 | NtTerminateProcess(NtCurrentProcess(), status); 230 | 231 | // -- cloned process 232 | } 233 | 234 | if (0 <= status) 235 | { 236 | NtClose(hThread); 237 | 238 | status = NtWaitForSingleObject(hProcess, TRUE, 0); 239 | 240 | NtClose(hProcess); 241 | 242 | if (STATUS_USER_APC == status) 243 | { 244 | DbgPrint("addr = %p, s = %x\n", ba.BaseAddress, ba.status); 245 | 246 | if (0 <= (status = ba.status)) 247 | { 248 | *phmod = ba.BaseAddress; 249 | } 250 | } 251 | else 252 | { 253 | status = STATUS_UNSUCCESSFUL; 254 | } 255 | } 256 | 257 | return status; 258 | } 259 | 260 | void WINAPI ep(void*) 261 | { 262 | MessageBoxW(0, 0, L"POC", MB_ICONWARNING); 263 | void* hmod; 264 | NTSTATUS status = fork(&hmod, L"kerberos.dll"); 265 | WCHAR sz[0x40]; 266 | if (0 > status) 267 | { 268 | swprintf_s(sz, _countof(sz), L"error = %x", status); 269 | } 270 | else 271 | { 272 | swprintf_s(sz, _countof(sz), L"hmod = %p", hmod); 273 | } 274 | MessageBoxW(0, sz, L"load kerberos", MB_ICONINFORMATION); 275 | 276 | if (0 <= status) 277 | { 278 | status = fork(&hmod, 0, hmod); 279 | swprintf_s(sz, _countof(sz), L"error = %x", status); 280 | MessageBoxW(0, sz, L"unload", MB_ICONINFORMATION); 281 | } 282 | 283 | ExitProcess(0); 284 | } 285 | -------------------------------------------------------------------------------- /SkipPsNotify/regedit.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbmm/RtlClone/a966a2e3de42025810f5649ed061b7c8e0ae5ad6/SkipPsNotify/regedit.ico -------------------------------------------------------------------------------- /SkipPsNotify/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by ITUI.rc 4 | // 5 | 6 | // Next default values for new objects 7 | // 8 | #ifdef APSTUDIO_INVOKED 9 | #ifndef APSTUDIO_READONLY_SYMBOLS 10 | #define _APS_NEXT_RESOURCE_VALUE 101 11 | #define _APS_NEXT_COMMAND_VALUE 40001 12 | #define _APS_NEXT_CONTROL_VALUE 1001 13 | #define _APS_NEXT_SYMED_VALUE 101 14 | #endif 15 | #endif 16 | -------------------------------------------------------------------------------- /SkipPsNotify/stdafx.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | 3 | void* __cdecl operator new[](size_t ByteSize) 4 | { 5 | return HeapAlloc(GetProcessHeap(), 0, ByteSize); 6 | } 7 | 8 | void* __cdecl operator new(size_t ByteSize) 9 | { 10 | return HeapAlloc(GetProcessHeap(), 0, ByteSize); 11 | } 12 | 13 | void __cdecl operator delete(void* Buffer) 14 | { 15 | HeapFree(GetProcessHeap(), 0, Buffer); 16 | } 17 | 18 | void __cdecl operator delete(void* Buffer, size_t) 19 | { 20 | HeapFree(GetProcessHeap(), 0, Buffer); 21 | } 22 | 23 | void __cdecl operator delete[](void* Buffer) 24 | { 25 | HeapFree(GetProcessHeap(), 0, Buffer); 26 | } 27 | 28 | void __cdecl operator delete[](void* Buffer, size_t) 29 | { 30 | HeapFree(GetProcessHeap(), 0, Buffer); 31 | } -------------------------------------------------------------------------------- /SkipPsNotify/stdafx.h: -------------------------------------------------------------------------------- 1 | #define SECURITY_WIN32 2 | #include "pch.h" -------------------------------------------------------------------------------- /Solution.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 17 4 | VisualStudioVersion = 17.6.33723.286 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Clone", "src\Clone.vcxproj", "{99B006C0-3A27-3A3C-6588-6C86BD57A80D}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SkipPsNotify", "SkipPsNotify\SkipPsNotify.vcxproj", "{983067F0-C52A-5216-A233-AEFCF52D77DC}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Release|x64 = Release|x64 13 | Release|x86 = Release|x86 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {99B006C0-3A27-3A3C-6588-6C86BD57A80D}.Release|x64.ActiveCfg = Release|x64 17 | {99B006C0-3A27-3A3C-6588-6C86BD57A80D}.Release|x64.Build.0 = Release|x64 18 | {99B006C0-3A27-3A3C-6588-6C86BD57A80D}.Release|x86.ActiveCfg = Release|Win32 19 | {99B006C0-3A27-3A3C-6588-6C86BD57A80D}.Release|x86.Build.0 = Release|Win32 20 | {983067F0-C52A-5216-A233-AEFCF52D77DC}.Release|x64.ActiveCfg = Release|x64 21 | {983067F0-C52A-5216-A233-AEFCF52D77DC}.Release|x64.Build.0 = Release|x64 22 | {983067F0-C52A-5216-A233-AEFCF52D77DC}.Release|x86.ActiveCfg = Release|Win32 23 | {983067F0-C52A-5216-A233-AEFCF52D77DC}.Release|x86.Build.0 = Release|Win32 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {0A7AB709-7E2F-4C29-BCBC-0C0093D1DE9D} 30 | SolutionGuid = {31E95A3C-0BE4-4890-815C-0391F78DB4AF} 31 | SolutionGuid = {3F900B2D-D854-4D44-9CC2-C7D9A85A41A3} 32 | SolutionGuid = {FA75AC33-EDD7-4B1A-8D3E-6AE708A788CE} 33 | EndGlobalSection 34 | EndGlobal 35 | -------------------------------------------------------------------------------- /pnth/.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /pnth/mini_yvals.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #ifndef _HAS_CXX17 4 | #ifdef _MSVC_LANG 5 | #if _MSVC_LANG > 201402 6 | #define _HAS_CXX17 1 7 | #else /* _MSVC_LANG > 201402 */ 8 | #define _HAS_CXX17 0 9 | #endif /* _MSVC_LANG > 201402 */ 10 | #else /* _MSVC_LANG */ 11 | #if __cplusplus > 201402 12 | #define _HAS_CXX17 1 13 | #else /* __cplusplus > 201402 */ 14 | #define _HAS_CXX17 0 15 | #endif /* __cplusplus > 201402 */ 16 | #endif /* _MSVC_LANG */ 17 | #endif /* _HAS_CXX17 */ 18 | 19 | #ifndef _NODISCARD 20 | #if _HAS_CXX17 21 | #define _NODISCARD [[nodiscard]] 22 | #else 23 | #define _NODISCARD 24 | #endif 25 | #endif//_NODISCARD 26 | 27 | #ifndef _CRT_STRINGIZE 28 | #define _CRT_STRINGIZE_(x) #x 29 | #define _CRT_STRINGIZE(x) _CRT_STRINGIZE_(x) 30 | #endif 31 | 32 | #ifndef _CRT_WIDE 33 | #define _CRT_WIDE_(s) L ## s 34 | #define _CRT_WIDE(s) _CRT_WIDE_(s) 35 | #endif 36 | 37 | #ifndef _CRT_CONCATENATE 38 | #define _CRT_CONCATENATE_(a, b) a ## b 39 | #define _CRT_CONCATENATE(a, b) _CRT_CONCATENATE_(a, b) 40 | #endif 41 | 42 | 43 | #ifndef _CRT_UNPARENTHESIZE 44 | #define _CRT_UNPARENTHESIZE_(...) __VA_ARGS__ 45 | #define _CRT_UNPARENTHESIZE(...) _CRT_UNPARENTHESIZE_ __VA_ARGS__ 46 | #endif 47 | 48 | #ifndef __has_cpp_attribute // vvv no attributes vvv 49 | #define _LIKELY 50 | #define _UNLIKELY 51 | #elif __has_cpp_attribute(likely) >= 201803L && __has_cpp_attribute(unlikely) >= 201803L // ^^^ no attr / C++20 attr vvv 52 | #define _LIKELY [[likely]] 53 | #define _UNLIKELY [[unlikely]] 54 | #elif defined(__clang__) // ^^^ C++20 attributes / clang attributes and C++17 or C++14 vvv 55 | #define _LIKELY [[__likely__]] 56 | #define _UNLIKELY [[__unlikely__]] 57 | #else // ^^^ clang attributes and C++17 or C++14 / C1XX attributes and C++17 or C++14 vvv 58 | #define _LIKELY 59 | #define _UNLIKELY 60 | #endif // ^^^ C1XX attributes and C++17 or C++14 ^^^ 61 | 62 | 63 | -------------------------------------------------------------------------------- /pnth/ntdbg.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTDBG_H 13 | #define _NTDBG_H 14 | 15 | // Debugging 16 | 17 | NTSYSAPI 18 | VOID 19 | NTAPI 20 | DbgUserBreakPoint( 21 | VOID 22 | ); 23 | 24 | NTSYSAPI 25 | VOID 26 | NTAPI 27 | DbgBreakPoint( 28 | VOID 29 | ); 30 | 31 | NTSYSAPI 32 | VOID 33 | NTAPI 34 | DbgBreakPointWithStatus( 35 | _In_ ULONG Status 36 | ); 37 | 38 | #define DBG_STATUS_CONTROL_C 1 39 | #define DBG_STATUS_SYSRQ 2 40 | #define DBG_STATUS_BUGCHECK_FIRST 3 41 | #define DBG_STATUS_BUGCHECK_SECOND 4 42 | #define DBG_STATUS_FATAL 5 43 | #define DBG_STATUS_DEBUG_CONTROL 6 44 | #define DBG_STATUS_WORKER 7 45 | 46 | NTSYSAPI 47 | ULONG 48 | STDAPIVCALLTYPE 49 | DbgPrint( 50 | _In_z_ _Printf_format_string_ PCSTR Format, 51 | ... 52 | ); 53 | 54 | NTSYSAPI 55 | ULONG 56 | STDAPIVCALLTYPE 57 | DbgPrintEx( 58 | _In_ ULONG ComponentId, 59 | _In_ ULONG Level, 60 | _In_z_ _Printf_format_string_ PCSTR Format, 61 | ... 62 | ); 63 | 64 | NTSYSAPI 65 | ULONG 66 | NTAPI 67 | vDbgPrintEx( 68 | _In_ ULONG ComponentId, 69 | _In_ ULONG Level, 70 | _In_z_ PCCH Format, 71 | _In_ va_list arglist 72 | ); 73 | 74 | NTSYSAPI 75 | ULONG 76 | NTAPI 77 | vDbgPrintExWithPrefix( 78 | _In_z_ PCCH Prefix, 79 | _In_ ULONG ComponentId, 80 | _In_ ULONG Level, 81 | _In_z_ PCCH Format, 82 | _In_ va_list arglist 83 | ); 84 | 85 | NTSYSAPI 86 | NTSTATUS 87 | NTAPI 88 | DbgQueryDebugFilterState( 89 | _In_ ULONG ComponentId, 90 | _In_ ULONG Level 91 | ); 92 | 93 | NTSYSAPI 94 | NTSTATUS 95 | NTAPI 96 | DbgSetDebugFilterState( 97 | _In_ ULONG ComponentId, 98 | _In_ ULONG Level, 99 | _In_ BOOLEAN State 100 | ); 101 | 102 | NTSYSAPI 103 | ULONG 104 | NTAPI 105 | DbgPrompt( 106 | _In_ PCCH Prompt, 107 | _Out_writes_bytes_(Length) PCH Response, 108 | _In_ ULONG Length 109 | ); 110 | 111 | // Definitions 112 | 113 | typedef struct _DBGKM_EXCEPTION 114 | { 115 | EXCEPTION_RECORD ExceptionRecord; 116 | ULONG FirstChance; 117 | } DBGKM_EXCEPTION, *PDBGKM_EXCEPTION; 118 | 119 | typedef struct _DBGKM_CREATE_THREAD 120 | { 121 | ULONG SubSystemKey; 122 | PVOID StartAddress; 123 | } DBGKM_CREATE_THREAD, *PDBGKM_CREATE_THREAD; 124 | 125 | typedef struct _DBGKM_CREATE_PROCESS 126 | { 127 | ULONG SubSystemKey; 128 | HANDLE FileHandle; 129 | PVOID BaseOfImage; 130 | ULONG DebugInfoFileOffset; 131 | ULONG DebugInfoSize; 132 | DBGKM_CREATE_THREAD InitialThread; 133 | } DBGKM_CREATE_PROCESS, *PDBGKM_CREATE_PROCESS; 134 | 135 | typedef struct _DBGKM_EXIT_THREAD 136 | { 137 | NTSTATUS ExitStatus; 138 | } DBGKM_EXIT_THREAD, *PDBGKM_EXIT_THREAD; 139 | 140 | typedef struct _DBGKM_EXIT_PROCESS 141 | { 142 | NTSTATUS ExitStatus; 143 | } DBGKM_EXIT_PROCESS, *PDBGKM_EXIT_PROCESS; 144 | 145 | typedef struct _DBGKM_LOAD_DLL 146 | { 147 | HANDLE FileHandle; 148 | PVOID BaseOfDll; 149 | ULONG DebugInfoFileOffset; 150 | ULONG DebugInfoSize; 151 | PVOID NamePointer; 152 | } DBGKM_LOAD_DLL, *PDBGKM_LOAD_DLL; 153 | 154 | typedef struct _DBGKM_UNLOAD_DLL 155 | { 156 | PVOID BaseAddress; 157 | } DBGKM_UNLOAD_DLL, *PDBGKM_UNLOAD_DLL; 158 | 159 | typedef enum _DBG_STATE 160 | { 161 | DbgIdle, 162 | DbgReplyPending, 163 | DbgCreateThreadStateChange, 164 | DbgCreateProcessStateChange, 165 | DbgExitThreadStateChange, 166 | DbgExitProcessStateChange, 167 | DbgExceptionStateChange, 168 | DbgBreakpointStateChange, 169 | DbgSingleStepStateChange, 170 | DbgLoadDllStateChange, 171 | DbgUnloadDllStateChange 172 | } DBG_STATE, *PDBG_STATE; 173 | 174 | typedef struct _DBGUI_CREATE_THREAD 175 | { 176 | HANDLE HandleToThread; 177 | DBGKM_CREATE_THREAD NewThread; 178 | } DBGUI_CREATE_THREAD, *PDBGUI_CREATE_THREAD; 179 | 180 | typedef struct _DBGUI_CREATE_PROCESS 181 | { 182 | HANDLE HandleToProcess; 183 | HANDLE HandleToThread; 184 | DBGKM_CREATE_PROCESS NewProcess; 185 | } DBGUI_CREATE_PROCESS, *PDBGUI_CREATE_PROCESS; 186 | 187 | typedef struct _DBGUI_WAIT_STATE_CHANGE 188 | { 189 | DBG_STATE NewState; 190 | CLIENT_ID AppClientId; 191 | union 192 | { 193 | DBGKM_EXCEPTION Exception; 194 | DBGUI_CREATE_THREAD CreateThread; 195 | DBGUI_CREATE_PROCESS CreateProcessInfo; 196 | DBGKM_EXIT_THREAD ExitThread; 197 | DBGKM_EXIT_PROCESS ExitProcess; 198 | DBGKM_LOAD_DLL LoadDll; 199 | DBGKM_UNLOAD_DLL UnloadDll; 200 | }; 201 | } DBGUI_WAIT_STATE_CHANGE, *PDBGUI_WAIT_STATE_CHANGE; 202 | 203 | #define DEBUG_READ_EVENT 0x0001 204 | #define DEBUG_PROCESS_ASSIGN 0x0002 205 | #define DEBUG_SET_INFORMATION 0x0004 206 | #define DEBUG_QUERY_INFORMATION 0x0008 207 | #define DEBUG_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | \ 208 | DEBUG_READ_EVENT | DEBUG_PROCESS_ASSIGN | DEBUG_SET_INFORMATION | \ 209 | DEBUG_QUERY_INFORMATION) 210 | 211 | #define DEBUG_KILL_ON_CLOSE 0x1 212 | 213 | typedef enum _DEBUGOBJECTINFOCLASS 214 | { 215 | DebugObjectUnusedInformation, 216 | DebugObjectKillProcessOnExitInformation, // s: ULONG 217 | MaxDebugObjectInfoClass 218 | } DEBUGOBJECTINFOCLASS, *PDEBUGOBJECTINFOCLASS; 219 | 220 | // System calls 221 | 222 | NTSYSCALLAPI 223 | NTSTATUS 224 | NTAPI 225 | NtCreateDebugObject( 226 | _Out_ PHANDLE DebugObjectHandle, 227 | _In_ ACCESS_MASK DesiredAccess, 228 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 229 | _In_ ULONG Flags 230 | ); 231 | 232 | NTSYSCALLAPI 233 | NTSTATUS 234 | NTAPI 235 | NtDebugActiveProcess( 236 | _In_ HANDLE ProcessHandle, 237 | _In_ HANDLE DebugObjectHandle 238 | ); 239 | 240 | NTSYSCALLAPI 241 | NTSTATUS 242 | NTAPI 243 | NtDebugContinue( 244 | _In_ HANDLE DebugObjectHandle, 245 | _In_ PCLIENT_ID ClientId, 246 | _In_ NTSTATUS ContinueStatus 247 | ); 248 | 249 | NTSYSCALLAPI 250 | NTSTATUS 251 | NTAPI 252 | NtRemoveProcessDebug( 253 | _In_ HANDLE ProcessHandle, 254 | _In_ HANDLE DebugObjectHandle 255 | ); 256 | 257 | NTSYSCALLAPI 258 | NTSTATUS 259 | NTAPI 260 | NtSetInformationDebugObject( 261 | _In_ HANDLE DebugObjectHandle, 262 | _In_ DEBUGOBJECTINFOCLASS DebugObjectInformationClass, 263 | _In_ PVOID DebugInformation, 264 | _In_ ULONG DebugInformationLength, 265 | _Out_opt_ PULONG ReturnLength 266 | ); 267 | 268 | NTSYSCALLAPI 269 | NTSTATUS 270 | NTAPI 271 | NtWaitForDebugEvent( 272 | _In_ HANDLE DebugObjectHandle, 273 | _In_ BOOLEAN Alertable, 274 | _In_opt_ PLARGE_INTEGER Timeout, 275 | _Out_ PDBGUI_WAIT_STATE_CHANGE WaitStateChange 276 | ); 277 | 278 | // Debugging UI 279 | 280 | NTSYSAPI 281 | NTSTATUS 282 | NTAPI 283 | DbgUiConnectToDbg( 284 | VOID 285 | ); 286 | 287 | NTSYSAPI 288 | HANDLE 289 | NTAPI 290 | DbgUiGetThreadDebugObject( 291 | VOID 292 | ); 293 | 294 | NTSYSAPI 295 | VOID 296 | NTAPI 297 | DbgUiSetThreadDebugObject( 298 | _In_ HANDLE DebugObject 299 | ); 300 | 301 | NTSYSAPI 302 | NTSTATUS 303 | NTAPI 304 | DbgUiWaitStateChange( 305 | _Out_ PDBGUI_WAIT_STATE_CHANGE StateChange, 306 | _In_opt_ PLARGE_INTEGER Timeout 307 | ); 308 | 309 | NTSYSAPI 310 | NTSTATUS 311 | NTAPI 312 | DbgUiContinue( 313 | _In_ PCLIENT_ID AppClientId, 314 | _In_ NTSTATUS ContinueStatus 315 | ); 316 | 317 | NTSYSAPI 318 | NTSTATUS 319 | NTAPI 320 | DbgUiStopDebugging( 321 | _In_ HANDLE Process 322 | ); 323 | 324 | NTSYSAPI 325 | NTSTATUS 326 | NTAPI 327 | DbgUiDebugActiveProcess( 328 | _In_ HANDLE Process 329 | ); 330 | 331 | NTSYSAPI 332 | VOID 333 | NTAPI 334 | DbgUiRemoteBreakin( 335 | _In_ PVOID Context 336 | ); 337 | 338 | NTSYSAPI 339 | NTSTATUS 340 | NTAPI 341 | DbgUiIssueRemoteBreakin( 342 | _In_ HANDLE Process 343 | ); 344 | 345 | NTSYSAPI 346 | NTSTATUS 347 | NTAPI 348 | DbgUiConvertStateChangeStructure( 349 | _In_ PDBGUI_WAIT_STATE_CHANGE StateChange, 350 | _Out_ LPDEBUG_EVENT DebugEvent 351 | ); 352 | 353 | NTSYSAPI 354 | NTSTATUS 355 | NTAPI 356 | DbgUiConvertStateChangeStructureEx( 357 | _In_ PDBGUI_WAIT_STATE_CHANGE StateChange, 358 | _Out_ LPDEBUG_EVENT DebugEvent 359 | ); 360 | 361 | struct _EVENT_FILTER_DESCRIPTOR; 362 | 363 | typedef VOID (NTAPI *PENABLECALLBACK)( 364 | _In_ LPCGUID SourceId, 365 | _In_ ULONG IsEnabled, 366 | _In_ UCHAR Level, 367 | _In_ ULONGLONG MatchAnyKeyword, 368 | _In_ ULONGLONG MatchAllKeyword, 369 | _In_opt_ struct _EVENT_FILTER_DESCRIPTOR *FilterData, 370 | _Inout_opt_ PVOID CallbackContext 371 | ); 372 | 373 | typedef ULONGLONG REGHANDLE, *PREGHANDLE; 374 | 375 | NTSYSAPI 376 | NTSTATUS 377 | NTAPI 378 | EtwEventRegister( 379 | _In_ LPCGUID ProviderId, 380 | _In_opt_ PENABLECALLBACK EnableCallback, 381 | _In_opt_ PVOID CallbackContext, 382 | _Out_ PREGHANDLE RegHandle 383 | ); 384 | 385 | #endif 386 | -------------------------------------------------------------------------------- /pnth/ntgdi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTGDI_H 13 | #define _NTGDI_H 14 | 15 | #define GDI_MAX_HANDLE_COUNT 0xFFFF // 0x4000 16 | 17 | #define GDI_HANDLE_INDEX_SHIFT 0 18 | #define GDI_HANDLE_INDEX_BITS 16 19 | #define GDI_HANDLE_INDEX_MASK 0xffff 20 | 21 | #define GDI_HANDLE_TYPE_SHIFT 16 22 | #define GDI_HANDLE_TYPE_BITS 5 23 | #define GDI_HANDLE_TYPE_MASK 0x1f 24 | 25 | #define GDI_HANDLE_ALTTYPE_SHIFT 21 26 | #define GDI_HANDLE_ALTTYPE_BITS 2 27 | #define GDI_HANDLE_ALTTYPE_MASK 0x3 28 | 29 | #define GDI_HANDLE_STOCK_SHIFT 23 30 | #define GDI_HANDLE_STOCK_BITS 1 31 | #define GDI_HANDLE_STOCK_MASK 0x1 32 | 33 | #define GDI_HANDLE_UNIQUE_SHIFT 24 34 | #define GDI_HANDLE_UNIQUE_BITS 8 35 | #define GDI_HANDLE_UNIQUE_MASK 0xff 36 | 37 | #define GDI_HANDLE_INDEX(Handle) ((ULONG)(Handle) & GDI_HANDLE_INDEX_MASK) 38 | #define GDI_HANDLE_TYPE(Handle) (((ULONG)(Handle) >> GDI_HANDLE_TYPE_SHIFT) & GDI_HANDLE_TYPE_MASK) 39 | #define GDI_HANDLE_ALTTYPE(Handle) (((ULONG)(Handle) >> GDI_HANDLE_ALTTYPE_SHIFT) & GDI_HANDLE_ALTTYPE_MASK) 40 | #define GDI_HANDLE_STOCK(Handle) (((ULONG)(Handle) >> GDI_HANDLE_STOCK_SHIFT)) & GDI_HANDLE_STOCK_MASK) 41 | 42 | #define GDI_MAKE_HANDLE(Index, Unique) ((ULONG)(((ULONG)(Unique) << GDI_HANDLE_INDEX_BITS) | (ULONG)(Index))) 43 | 44 | // GDI server-side types 45 | 46 | #define GDI_DEF_TYPE 0 // invalid handle 47 | #define GDI_DC_TYPE 1 48 | #define GDI_DD_DIRECTDRAW_TYPE 2 49 | #define GDI_DD_SURFACE_TYPE 3 50 | #define GDI_RGN_TYPE 4 51 | #define GDI_SURF_TYPE 5 52 | #define GDI_CLIENTOBJ_TYPE 6 53 | #define GDI_PATH_TYPE 7 54 | #define GDI_PAL_TYPE 8 55 | #define GDI_ICMLCS_TYPE 9 56 | #define GDI_LFONT_TYPE 10 57 | #define GDI_RFONT_TYPE 11 58 | #define GDI_PFE_TYPE 12 59 | #define GDI_PFT_TYPE 13 60 | #define GDI_ICMCXF_TYPE 14 61 | #define GDI_ICMDLL_TYPE 15 62 | #define GDI_BRUSH_TYPE 16 63 | #define GDI_PFF_TYPE 17 // unused 64 | #define GDI_CACHE_TYPE 18 // unused 65 | #define GDI_SPACE_TYPE 19 66 | #define GDI_DBRUSH_TYPE 20 // unused 67 | #define GDI_META_TYPE 21 68 | #define GDI_EFSTATE_TYPE 22 69 | #define GDI_BMFD_TYPE 23 // unused 70 | #define GDI_VTFD_TYPE 24 // unused 71 | #define GDI_TTFD_TYPE 25 // unused 72 | #define GDI_RC_TYPE 26 // unused 73 | #define GDI_TEMP_TYPE 27 // unused 74 | #define GDI_DRVOBJ_TYPE 28 75 | #define GDI_DCIOBJ_TYPE 29 // unused 76 | #define GDI_SPOOL_TYPE 30 77 | 78 | // GDI client-side types 79 | 80 | #define GDI_CLIENT_TYPE_FROM_HANDLE(Handle) ((ULONG)(Handle) & ((GDI_HANDLE_ALTTYPE_MASK << GDI_HANDLE_ALTTYPE_SHIFT) | \ 81 | (GDI_HANDLE_TYPE_MASK << GDI_HANDLE_TYPE_SHIFT))) 82 | #define GDI_CLIENT_TYPE_FROM_UNIQUE(Unique) GDI_CLIENT_TYPE_FROM_HANDLE((ULONG)(Unique) << 16) 83 | 84 | #define GDI_ALTTYPE_1 (1 << GDI_HANDLE_ALTTYPE_SHIFT) 85 | #define GDI_ALTTYPE_2 (2 << GDI_HANDLE_ALTTYPE_SHIFT) 86 | #define GDI_ALTTYPE_3 (3 << GDI_HANDLE_ALTTYPE_SHIFT) 87 | 88 | #define GDI_CLIENT_BITMAP_TYPE (GDI_SURF_TYPE << GDI_HANDLE_TYPE_SHIFT) 89 | #define GDI_CLIENT_BRUSH_TYPE (GDI_BRUSH_TYPE << GDI_HANDLE_TYPE_SHIFT) 90 | #define GDI_CLIENT_CLIENTOBJ_TYPE (GDI_CLIENTOBJ_TYPE << GDI_HANDLE_TYPE_SHIFT) 91 | #define GDI_CLIENT_DC_TYPE (GDI_DC_TYPE << GDI_HANDLE_TYPE_SHIFT) 92 | #define GDI_CLIENT_FONT_TYPE (GDI_LFONT_TYPE << GDI_HANDLE_TYPE_SHIFT) 93 | #define GDI_CLIENT_PALETTE_TYPE (GDI_PAL_TYPE << GDI_HANDLE_TYPE_SHIFT) 94 | #define GDI_CLIENT_REGION_TYPE (GDI_RGN_TYPE << GDI_HANDLE_TYPE_SHIFT) 95 | 96 | #define GDI_CLIENT_ALTDC_TYPE (GDI_CLIENT_DC_TYPE | GDI_ALTTYPE_1) 97 | #define GDI_CLIENT_DIBSECTION_TYPE (GDI_CLIENT_BITMAP_TYPE | GDI_ALTTYPE_1) 98 | #define GDI_CLIENT_EXTPEN_TYPE (GDI_CLIENT_BRUSH_TYPE | GDI_ALTTYPE_2) 99 | #define GDI_CLIENT_METADC16_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_3) 100 | #define GDI_CLIENT_METAFILE_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_2) 101 | #define GDI_CLIENT_METAFILE16_TYPE (GDI_CLIENT_CLIENTOBJ_TYPE | GDI_ALTTYPE_1) 102 | #define GDI_CLIENT_PEN_TYPE (GDI_CLIENT_BRUSH_TYPE | GDI_ALTTYPE_1) 103 | 104 | typedef struct _GDI_HANDLE_ENTRY 105 | { 106 | union 107 | { 108 | PVOID Object; 109 | PVOID NextFree; 110 | }; 111 | union 112 | { 113 | struct 114 | { 115 | USHORT ProcessId; 116 | USHORT Lock : 1; 117 | USHORT Count : 15; 118 | }; 119 | ULONG Value; 120 | } Owner; 121 | USHORT Unique; 122 | UCHAR Type; 123 | UCHAR Flags; 124 | PVOID UserPointer; 125 | } GDI_HANDLE_ENTRY, *PGDI_HANDLE_ENTRY; 126 | 127 | typedef struct _GDI_SHARED_MEMORY 128 | { 129 | GDI_HANDLE_ENTRY Handles[GDI_MAX_HANDLE_COUNT]; 130 | } GDI_SHARED_MEMORY, *PGDI_SHARED_MEMORY; 131 | 132 | #endif 133 | -------------------------------------------------------------------------------- /pnth/ntkeapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTKEAPI_H 13 | #define _NTKEAPI_H 14 | 15 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 16 | #define LOW_PRIORITY 0 // Lowest thread priority level 17 | #define LOW_REALTIME_PRIORITY 16 // Lowest realtime priority level 18 | #define HIGH_PRIORITY 31 // Highest thread priority level 19 | #define MAXIMUM_PRIORITY 32 // Number of thread priority levels 20 | #endif 21 | 22 | typedef enum _KTHREAD_STATE 23 | { 24 | Initialized, 25 | Ready, 26 | Running, 27 | Standby, 28 | Terminated, 29 | Waiting, 30 | Transition, 31 | DeferredReady, 32 | GateWaitObsolete, 33 | WaitingForProcessInSwap, 34 | MaximumThreadState 35 | } KTHREAD_STATE, *PKTHREAD_STATE; 36 | 37 | // private 38 | typedef enum _KHETERO_CPU_POLICY 39 | { 40 | KHeteroCpuPolicyAll = 0, 41 | KHeteroCpuPolicyLarge = 1, 42 | KHeteroCpuPolicyLargeOrIdle = 2, 43 | KHeteroCpuPolicySmall = 3, 44 | KHeteroCpuPolicySmallOrIdle = 4, 45 | KHeteroCpuPolicyDynamic = 5, 46 | KHeteroCpuPolicyStaticMax = 5, // valid 47 | KHeteroCpuPolicyBiasedSmall = 6, 48 | KHeteroCpuPolicyBiasedLarge = 7, 49 | KHeteroCpuPolicyDefault = 8, 50 | KHeteroCpuPolicyMax = 9 51 | } KHETERO_CPU_POLICY, *PKHETERO_CPU_POLICY; 52 | 53 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 54 | 55 | typedef enum _KWAIT_REASON 56 | { 57 | Executive, 58 | FreePage, 59 | PageIn, 60 | PoolAllocation, 61 | DelayExecution, 62 | Suspended, 63 | UserRequest, 64 | WrExecutive, 65 | WrFreePage, 66 | WrPageIn, 67 | WrPoolAllocation, 68 | WrDelayExecution, 69 | WrSuspended, 70 | WrUserRequest, 71 | WrEventPair, 72 | WrQueue, 73 | WrLpcReceive, 74 | WrLpcReply, 75 | WrVirtualMemory, 76 | WrPageOut, 77 | WrRendezvous, 78 | WrKeyedEvent, 79 | WrTerminated, 80 | WrProcessInSwap, 81 | WrCpuRateControl, 82 | WrCalloutStack, 83 | WrKernel, 84 | WrResource, 85 | WrPushLock, 86 | WrMutex, 87 | WrQuantumEnd, 88 | WrDispatchInt, 89 | WrPreempted, 90 | WrYieldExecution, 91 | WrFastMutex, 92 | WrGuardedMutex, 93 | WrRundown, 94 | WrAlertByThreadId, 95 | WrDeferredPreempt, 96 | WrPhysicalFault, 97 | WrIoRing, 98 | WrMdlCache, 99 | MaximumWaitReason 100 | } KWAIT_REASON, *PKWAIT_REASON; 101 | 102 | typedef enum _KPROFILE_SOURCE 103 | { 104 | ProfileTime, 105 | ProfileAlignmentFixup, 106 | ProfileTotalIssues, 107 | ProfilePipelineDry, 108 | ProfileLoadInstructions, 109 | ProfilePipelineFrozen, 110 | ProfileBranchInstructions, 111 | ProfileTotalNonissues, 112 | ProfileDcacheMisses, 113 | ProfileIcacheMisses, 114 | ProfileCacheMisses, 115 | ProfileBranchMispredictions, 116 | ProfileStoreInstructions, 117 | ProfileFpInstructions, 118 | ProfileIntegerInstructions, 119 | Profile2Issue, 120 | Profile3Issue, 121 | Profile4Issue, 122 | ProfileSpecialInstructions, 123 | ProfileTotalCycles, 124 | ProfileIcacheIssues, 125 | ProfileDcacheAccesses, 126 | ProfileMemoryBarrierCycles, 127 | ProfileLoadLinkedIssues, 128 | ProfileMaximum 129 | } KPROFILE_SOURCE; 130 | 131 | #endif 132 | 133 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 134 | 135 | NTSYSCALLAPI 136 | NTSTATUS 137 | NTAPI 138 | NtCallbackReturn( 139 | _In_reads_bytes_opt_(OutputLength) PVOID OutputBuffer, 140 | _In_ ULONG OutputLength, 141 | _In_ NTSTATUS Status 142 | ); 143 | 144 | #if (PHNT_VERSION >= PHNT_VISTA) 145 | NTSYSCALLAPI 146 | VOID 147 | NTAPI 148 | NtFlushProcessWriteBuffers( 149 | VOID 150 | ); 151 | #endif 152 | 153 | NTSYSCALLAPI 154 | NTSTATUS 155 | NTAPI 156 | NtQueryDebugFilterState( 157 | _In_ ULONG ComponentId, 158 | _In_ ULONG Level 159 | ); 160 | 161 | NTSYSCALLAPI 162 | NTSTATUS 163 | NTAPI 164 | NtSetDebugFilterState( 165 | _In_ ULONG ComponentId, 166 | _In_ ULONG Level, 167 | _In_ BOOLEAN State 168 | ); 169 | 170 | NTSYSCALLAPI 171 | NTSTATUS 172 | NTAPI 173 | NtYieldExecution( 174 | VOID 175 | ); 176 | 177 | #endif 178 | 179 | #endif 180 | -------------------------------------------------------------------------------- /pnth/ntmisc.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTMISC_H 13 | #define _NTMISC_H 14 | 15 | // Filter manager 16 | 17 | #define FLT_PORT_CONNECT 0x0001 18 | #define FLT_PORT_ALL_ACCESS (FLT_PORT_CONNECT | STANDARD_RIGHTS_ALL) 19 | 20 | // VDM 21 | 22 | typedef enum _VDMSERVICECLASS 23 | { 24 | VdmStartExecution, 25 | VdmQueueInterrupt, 26 | VdmDelayInterrupt, 27 | VdmInitialize, 28 | VdmFeatures, 29 | VdmSetInt21Handler, 30 | VdmQueryDir, 31 | VdmPrinterDirectIoOpen, 32 | VdmPrinterDirectIoClose, 33 | VdmPrinterInitialize, 34 | VdmSetLdtEntries, 35 | VdmSetProcessLdtInfo, 36 | VdmAdlibEmulation, 37 | VdmPMCliControl, 38 | VdmQueryVdmProcess, 39 | VdmPreInitialize 40 | } VDMSERVICECLASS, *PVDMSERVICECLASS; 41 | 42 | NTSYSCALLAPI 43 | NTSTATUS 44 | NTAPI 45 | NtVdmControl( 46 | _In_ VDMSERVICECLASS Service, 47 | _Inout_ PVOID ServiceData 48 | ); 49 | 50 | // WMI/ETW 51 | 52 | NTSYSCALLAPI 53 | NTSTATUS 54 | NTAPI 55 | NtTraceEvent( 56 | _In_ HANDLE TraceHandle, 57 | _In_ ULONG Flags, 58 | _In_ ULONG FieldSize, 59 | _In_ PVOID Fields 60 | ); 61 | 62 | typedef enum _TRACE_CONTROL_INFORMATION_CLASS 63 | { 64 | TraceControlStartLogger = 1, // inout WMI_LOGGER_INFORMATION 65 | TraceControlStopLogger = 2, // inout WMI_LOGGER_INFORMATION 66 | TraceControlQueryLogger = 3, // inout WMI_LOGGER_INFORMATION 67 | TraceControlUpdateLogger = 4, // inout WMI_LOGGER_INFORMATION 68 | TraceControlFlushLogger = 5, // inout WMI_LOGGER_INFORMATION 69 | TraceControlIncrementLoggerFile = 6, // inout WMI_LOGGER_INFORMATION 70 | TraceControlUnknown = 7, 71 | // unused 72 | TraceControlRealtimeConnect = 11, 73 | TraceControlActivityIdCreate = 12, 74 | TraceControlWdiDispatchControl = 13, 75 | TraceControlRealtimeDisconnectConsumerByHandle = 14, // in HANDLE 76 | TraceControlRegisterGuidsCode = 15, 77 | TraceControlReceiveNotification = 16, 78 | TraceControlSendDataBlock = 17, // ETW_ENABLE_NOTIFICATION_PACKET 79 | TraceControlSendReplyDataBlock = 18, 80 | TraceControlReceiveReplyDataBlock = 19, 81 | TraceControlWdiUpdateSem = 20, 82 | TraceControlEnumTraceGuidList = 21, // out GUID[] 83 | TraceControlGetTraceGuidInfo = 22, // in GUID, out TRACE_GUID_INFO 84 | TraceControlEnumerateTraceGuids = 23, 85 | TraceControlRegisterSecurityProv = 24, 86 | TraceControlQueryReferenceTime = 25, 87 | TraceControlTrackProviderBinary = 26, // in HANDLE 88 | TraceControlAddNotificationEvent = 27, 89 | TraceControlUpdateDisallowList = 28, 90 | TraceControlSetEnableAllKeywordsCode = 29, 91 | TraceControlSetProviderTraitsCode = 30, 92 | TraceControlUseDescriptorTypeCode = 31, 93 | TraceControlEnumTraceGroupList = 32, 94 | TraceControlGetTraceGroupInfo = 33, 95 | TraceControlTraceSetDisallowList = 34, 96 | TraceControlSetCompressionSettings = 35, 97 | TraceControlGetCompressionSettings = 36, 98 | TraceControlUpdatePeriodicCaptureState = 37, 99 | TraceControlGetPrivateSessionTraceHandle = 38, 100 | TraceControlRegisterPrivateSession = 39, 101 | TraceControlQuerySessionDemuxObject = 40, 102 | TraceControlSetProviderBinaryTracking = 41, 103 | TraceControlMaxLoggers = 42, // out ULONG 104 | TraceControlMaxPmcCounter = 43, // out ULONG 105 | TraceControlQueryUsedProcessorCount = 44, // ULONG // since WIN11 106 | TraceControlGetPmcOwnership = 45, 107 | } TRACE_CONTROL_INFORMATION_CLASS; 108 | 109 | #if (PHNT_VERSION >= PHNT_VISTA) 110 | NTSYSCALLAPI 111 | NTSTATUS 112 | NTAPI 113 | NtTraceControl( 114 | _In_ TRACE_CONTROL_INFORMATION_CLASS TraceInformationClass, 115 | _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, 116 | _In_ ULONG InputBufferLength, 117 | _Out_writes_bytes_opt_(TraceInformationLength) PVOID TraceInformation, 118 | _In_ ULONG TraceInformationLength, 119 | _Out_ PULONG ReturnLength 120 | ); 121 | #endif 122 | 123 | #endif 124 | -------------------------------------------------------------------------------- /pnth/ntnls.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTNLS_H 13 | #define _NTNLS_H 14 | 15 | #define MAXIMUM_LEADBYTES 12 16 | 17 | // This structure is the data from the raw codepage files. Note that we set the "Codepage" field 18 | // last, so any threads accessing this pointers in this structure should check to see if that is 19 | // CP_UTF8 (65001) first. If so, they should not use the pointers. 20 | // MemoryBarrier might be warranted before checking CodePage to protect out-of-order reads of the pointers. 21 | typedef struct _CPTABLEINFO { 22 | USHORT CodePage; // code page number (For UTF-8 the rest of the structure is unused) 23 | USHORT MaximumCharacterSize; // max length (bytes) of a char 24 | USHORT DefaultChar; // default character (MB) 25 | USHORT UniDefaultChar; // default character (Unicode) 26 | USHORT TransDefaultChar; // translation of default char (Unicode) 27 | USHORT TransUniDefaultChar; // translation of Unic default char (MB) 28 | USHORT DBCSCodePage; // Non 0 for DBCS code pages 29 | UCHAR LeadByte[MAXIMUM_LEADBYTES]; // lead byte ranges 30 | PUSHORT MultiByteTable; // pointer to MB->Unicode translation table 31 | PVOID WideCharTable; // pointer to WC (Unicode->CodePage) translation table 32 | PUSHORT DBCSRanges; // pointer to DBCS ranges (UNUSED, DO NOT SET) 33 | PUSHORT DBCSOffsets; // pointer to DBCS offsets 34 | } CPTABLEINFO, *PCPTABLEINFO; 35 | 36 | typedef struct _NLSTABLEINFO { 37 | CPTABLEINFO OemTableInfo; 38 | CPTABLEINFO AnsiTableInfo; 39 | PUSHORT UpperCaseTable; // 844 format upcase table 40 | PUSHORT LowerCaseTable; // 844 format lower case table 41 | } NLSTABLEINFO, *PNLSTABLEINFO; 42 | 43 | typedef struct _RTL_NLS_STATE { 44 | CPTABLEINFO DefaultAcpTableInfo; 45 | CPTABLEINFO DefaultOemTableInfo; 46 | PUSHORT ActiveCodePageData; 47 | PUSHORT OemCodePageData; 48 | PUSHORT LeadByteInfo; 49 | PUSHORT OemLeadByteInfo; 50 | PUSHORT CaseMappingData; 51 | PUSHORT UnicodeUpcaseTable844; 52 | PUSHORT UnicodeLowercaseTable844; 53 | } RTL_NLS_STATE, *PRTL_NLS_STATE; 54 | 55 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 56 | 57 | #ifdef DATA_EXPORT 58 | _DATAIMP USHORT NlsAnsiCodePage; 59 | _DATAIMP BOOLEAN NlsMbCodePageTag; 60 | _DATAIMP BOOLEAN NlsMbOemCodePageTag; 61 | 62 | #endif 63 | 64 | #endif 65 | 66 | #endif 67 | -------------------------------------------------------------------------------- /pnth/ntobapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTOBAPI_H 13 | #define _NTOBAPI_H 14 | 15 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 16 | #define OBJECT_TYPE_CREATE 0x0001 17 | #define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) 18 | #endif 19 | 20 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 21 | #define DIRECTORY_QUERY 0x0001 22 | #define DIRECTORY_TRAVERSE 0x0002 23 | #define DIRECTORY_CREATE_OBJECT 0x0004 24 | #define DIRECTORY_CREATE_SUBDIRECTORY 0x0008 25 | #define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xf) 26 | #endif 27 | 28 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 29 | #define SYMBOLIC_LINK_QUERY 0x0001 30 | #define SYMBOLIC_LINK_SET 0x0002 31 | #define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1) 32 | #define SYMBOLIC_LINK_ALL_ACCESS_EX (STANDARD_RIGHTS_REQUIRED | 0xFFFF) 33 | #endif 34 | 35 | #ifndef OBJ_PROTECT_CLOSE 36 | #define OBJ_PROTECT_CLOSE 0x00000001 37 | #endif 38 | #ifndef OBJ_INHERIT 39 | #define OBJ_INHERIT 0x00000002 40 | #endif 41 | #ifndef OBJ_AUDIT_OBJECT_CLOSE 42 | #define OBJ_AUDIT_OBJECT_CLOSE 0x00000004 43 | #endif 44 | 45 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 46 | typedef enum _OBJECT_INFORMATION_CLASS 47 | { 48 | ObjectBasicInformation, // q: OBJECT_BASIC_INFORMATION 49 | ObjectNameInformation, // q: OBJECT_NAME_INFORMATION 50 | ObjectTypeInformation, // q: OBJECT_TYPE_INFORMATION 51 | ObjectTypesInformation, // q: OBJECT_TYPES_INFORMATION 52 | ObjectHandleFlagInformation, // qs: OBJECT_HANDLE_FLAG_INFORMATION 53 | ObjectSessionInformation, // s: void // change object session // (requires SeTcbPrivilege) 54 | ObjectSessionObjectInformation, // s: void // change object session // (requires SeTcbPrivilege) 55 | MaxObjectInfoClass 56 | } OBJECT_INFORMATION_CLASS; 57 | #else 58 | #define ObjectBasicInformation 0 59 | #define ObjectNameInformation 1 60 | #define ObjectTypeInformation 2 61 | #define ObjectTypesInformation 3 62 | #define ObjectHandleFlagInformation 4 63 | #define ObjectSessionInformation 5 64 | #define ObjectSessionObjectInformation 6 65 | #endif 66 | 67 | typedef struct _OBJECT_BASIC_INFORMATION 68 | { 69 | ULONG Attributes; 70 | ACCESS_MASK GrantedAccess; 71 | ULONG HandleCount; 72 | ULONG PointerCount; 73 | ULONG PagedPoolCharge; 74 | ULONG NonPagedPoolCharge; 75 | ULONG Reserved[3]; 76 | ULONG NameInfoSize; 77 | ULONG TypeInfoSize; 78 | ULONG SecurityDescriptorSize; 79 | LARGE_INTEGER CreationTime; 80 | } OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION; 81 | 82 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 83 | typedef struct _OBJECT_NAME_INFORMATION 84 | { 85 | UNICODE_STRING Name; 86 | } OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION; 87 | #endif 88 | 89 | typedef struct _OBJECT_TYPE_INFORMATION 90 | { 91 | UNICODE_STRING TypeName; 92 | ULONG TotalNumberOfObjects; 93 | ULONG TotalNumberOfHandles; 94 | ULONG TotalPagedPoolUsage; 95 | ULONG TotalNonPagedPoolUsage; 96 | ULONG TotalNamePoolUsage; 97 | ULONG TotalHandleTableUsage; 98 | ULONG HighWaterNumberOfObjects; 99 | ULONG HighWaterNumberOfHandles; 100 | ULONG HighWaterPagedPoolUsage; 101 | ULONG HighWaterNonPagedPoolUsage; 102 | ULONG HighWaterNamePoolUsage; 103 | ULONG HighWaterHandleTableUsage; 104 | ULONG InvalidAttributes; 105 | GENERIC_MAPPING GenericMapping; 106 | ULONG ValidAccessMask; 107 | BOOLEAN SecurityRequired; 108 | BOOLEAN MaintainHandleCount; 109 | UCHAR TypeIndex; // since WINBLUE 110 | CHAR ReservedByte; 111 | ULONG PoolType; 112 | ULONG DefaultPagedPoolCharge; 113 | ULONG DefaultNonPagedPoolCharge; 114 | } OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION; 115 | 116 | typedef struct _OBJECT_TYPES_INFORMATION 117 | { 118 | ULONG NumberOfTypes; 119 | } OBJECT_TYPES_INFORMATION, *POBJECT_TYPES_INFORMATION; 120 | 121 | typedef struct _OBJECT_HANDLE_FLAG_INFORMATION 122 | { 123 | BOOLEAN Inherit; 124 | BOOLEAN ProtectFromClose; 125 | } OBJECT_HANDLE_FLAG_INFORMATION, *POBJECT_HANDLE_FLAG_INFORMATION; 126 | 127 | // Objects, handles 128 | 129 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 130 | 131 | NTSYSCALLAPI 132 | NTSTATUS 133 | NTAPI 134 | NtQueryObject( 135 | _In_opt_ HANDLE Handle, 136 | _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, 137 | _Out_writes_bytes_opt_(ObjectInformationLength) PVOID ObjectInformation, 138 | _In_ ULONG ObjectInformationLength, 139 | _Out_opt_ PULONG ReturnLength 140 | ); 141 | 142 | NTSYSCALLAPI 143 | NTSTATUS 144 | NTAPI 145 | NtSetInformationObject( 146 | _In_ HANDLE Handle, 147 | _In_ OBJECT_INFORMATION_CLASS ObjectInformationClass, 148 | _In_reads_bytes_(ObjectInformationLength) PVOID ObjectInformation, 149 | _In_ ULONG ObjectInformationLength 150 | ); 151 | 152 | #define DUPLICATE_CLOSE_SOURCE 0x00000001 153 | #define DUPLICATE_SAME_ACCESS 0x00000002 154 | #define DUPLICATE_SAME_ATTRIBUTES 0x00000004 155 | 156 | NTSYSCALLAPI 157 | NTSTATUS 158 | NTAPI 159 | NtDuplicateObject( 160 | _In_ HANDLE SourceProcessHandle, 161 | _In_ HANDLE SourceHandle, 162 | _In_opt_ HANDLE TargetProcessHandle, 163 | _Out_opt_ PHANDLE TargetHandle, 164 | _In_ ACCESS_MASK DesiredAccess, 165 | _In_ ULONG HandleAttributes, 166 | _In_ ULONG Options 167 | ); 168 | 169 | NTSYSCALLAPI 170 | NTSTATUS 171 | NTAPI 172 | NtMakeTemporaryObject( 173 | _In_ HANDLE Handle 174 | ); 175 | 176 | NTSYSCALLAPI 177 | NTSTATUS 178 | NTAPI 179 | NtMakePermanentObject( 180 | _In_ HANDLE Handle 181 | ); 182 | 183 | NTSYSCALLAPI 184 | NTSTATUS 185 | NTAPI 186 | NtSignalAndWaitForSingleObject( 187 | _In_ HANDLE SignalHandle, 188 | _In_ HANDLE WaitHandle, 189 | _In_ BOOLEAN Alertable, 190 | _In_opt_ PLARGE_INTEGER Timeout 191 | ); 192 | 193 | NTSYSCALLAPI 194 | NTSTATUS 195 | NTAPI 196 | NtWaitForSingleObject( 197 | _In_ HANDLE Handle, 198 | _In_ BOOLEAN Alertable, 199 | _In_opt_ PLARGE_INTEGER Timeout 200 | ); 201 | 202 | NTSYSCALLAPI 203 | NTSTATUS 204 | NTAPI 205 | NtWaitForMultipleObjects( 206 | _In_ ULONG Count, 207 | _In_reads_(Count) HANDLE Handles[], 208 | _In_ WAIT_TYPE WaitType, 209 | _In_ BOOLEAN Alertable, 210 | _In_opt_ PLARGE_INTEGER Timeout 211 | ); 212 | 213 | #if (PHNT_VERSION >= PHNT_WS03) 214 | NTSYSCALLAPI 215 | NTSTATUS 216 | NTAPI 217 | NtWaitForMultipleObjects32( 218 | _In_ ULONG Count, 219 | _In_reads_(Count) LONG Handles[], 220 | _In_ WAIT_TYPE WaitType, 221 | _In_ BOOLEAN Alertable, 222 | _In_opt_ PLARGE_INTEGER Timeout 223 | ); 224 | #endif 225 | 226 | NTSYSCALLAPI 227 | NTSTATUS 228 | NTAPI 229 | NtSetSecurityObject( 230 | _In_ HANDLE Handle, 231 | _In_ SECURITY_INFORMATION SecurityInformation, 232 | _In_ PSECURITY_DESCRIPTOR SecurityDescriptor 233 | ); 234 | 235 | NTSYSCALLAPI 236 | NTSTATUS 237 | NTAPI 238 | NtQuerySecurityObject( 239 | _In_ HANDLE Handle, 240 | _In_ SECURITY_INFORMATION SecurityInformation, 241 | _Out_writes_bytes_opt_(Length) PSECURITY_DESCRIPTOR SecurityDescriptor, 242 | _In_ ULONG Length, 243 | _Out_ PULONG LengthNeeded 244 | ); 245 | 246 | NTSYSCALLAPI 247 | NTSTATUS 248 | NTAPI 249 | NtClose( 250 | _In_ _Post_ptr_invalid_ HANDLE Handle 251 | ); 252 | 253 | #if (PHNT_VERSION >= PHNT_THRESHOLD) 254 | NTSYSCALLAPI 255 | NTSTATUS 256 | NTAPI 257 | NtCompareObjects( 258 | _In_ HANDLE FirstObjectHandle, 259 | _In_ HANDLE SecondObjectHandle 260 | ); 261 | #endif 262 | 263 | #endif 264 | 265 | // Directory objects 266 | 267 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 268 | 269 | NTSYSCALLAPI 270 | NTSTATUS 271 | NTAPI 272 | NtCreateDirectoryObject( 273 | _Out_ PHANDLE DirectoryHandle, 274 | _In_ ACCESS_MASK DesiredAccess, 275 | _In_ POBJECT_ATTRIBUTES ObjectAttributes 276 | ); 277 | 278 | #if (PHNT_VERSION >= PHNT_WIN8) 279 | NTSYSCALLAPI 280 | NTSTATUS 281 | NTAPI 282 | NtCreateDirectoryObjectEx( 283 | _Out_ PHANDLE DirectoryHandle, 284 | _In_ ACCESS_MASK DesiredAccess, 285 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 286 | _In_ HANDLE ShadowDirectoryHandle, 287 | _In_ ULONG Flags 288 | ); 289 | #endif 290 | 291 | NTSYSCALLAPI 292 | NTSTATUS 293 | NTAPI 294 | NtOpenDirectoryObject( 295 | _Out_ PHANDLE DirectoryHandle, 296 | _In_ ACCESS_MASK DesiredAccess, 297 | _In_ POBJECT_ATTRIBUTES ObjectAttributes 298 | ); 299 | 300 | typedef struct _OBJECT_DIRECTORY_INFORMATION 301 | { 302 | UNICODE_STRING Name; 303 | UNICODE_STRING TypeName; 304 | } OBJECT_DIRECTORY_INFORMATION, *POBJECT_DIRECTORY_INFORMATION; 305 | 306 | NTSYSCALLAPI 307 | NTSTATUS 308 | NTAPI 309 | NtQueryDirectoryObject( 310 | _In_ HANDLE DirectoryHandle, 311 | _Out_writes_bytes_opt_(Length) PVOID Buffer, 312 | _In_ ULONG Length, 313 | _In_ BOOLEAN ReturnSingleEntry, 314 | _In_ BOOLEAN RestartScan, 315 | _Inout_ PULONG Context, 316 | _Out_opt_ PULONG ReturnLength 317 | ); 318 | 319 | #endif 320 | 321 | // Private namespaces 322 | 323 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 324 | 325 | #if (PHNT_VERSION >= PHNT_VISTA) 326 | 327 | // private 328 | typedef enum _BOUNDARY_ENTRY_TYPE 329 | { 330 | OBNS_Invalid, 331 | OBNS_Name, 332 | OBNS_SID, 333 | OBNS_IL 334 | } BOUNDARY_ENTRY_TYPE; 335 | 336 | // private 337 | typedef struct _OBJECT_BOUNDARY_ENTRY 338 | { 339 | BOUNDARY_ENTRY_TYPE EntryType; 340 | ULONG EntrySize; 341 | } OBJECT_BOUNDARY_ENTRY, *POBJECT_BOUNDARY_ENTRY; 342 | 343 | // rev 344 | #define OBJECT_BOUNDARY_DESCRIPTOR_VERSION 1 345 | 346 | // private 347 | typedef struct _OBJECT_BOUNDARY_DESCRIPTOR 348 | { 349 | ULONG Version; 350 | ULONG Items; 351 | ULONG TotalSize; 352 | union 353 | { 354 | ULONG Flags; 355 | struct 356 | { 357 | ULONG AddAppContainerSid : 1; 358 | ULONG Reserved : 31; 359 | }; 360 | }; 361 | } OBJECT_BOUNDARY_DESCRIPTOR, *POBJECT_BOUNDARY_DESCRIPTOR; 362 | 363 | NTSYSCALLAPI 364 | NTSTATUS 365 | NTAPI 366 | NtCreatePrivateNamespace( 367 | _Out_ PHANDLE NamespaceHandle, 368 | _In_ ACCESS_MASK DesiredAccess, 369 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 370 | _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor 371 | ); 372 | 373 | NTSYSCALLAPI 374 | NTSTATUS 375 | NTAPI 376 | NtOpenPrivateNamespace( 377 | _Out_ PHANDLE NamespaceHandle, 378 | _In_ ACCESS_MASK DesiredAccess, 379 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 380 | _In_ POBJECT_BOUNDARY_DESCRIPTOR BoundaryDescriptor 381 | ); 382 | 383 | NTSYSCALLAPI 384 | NTSTATUS 385 | NTAPI 386 | NtDeletePrivateNamespace( 387 | _In_ HANDLE NamespaceHandle 388 | ); 389 | 390 | #endif 391 | 392 | #endif 393 | 394 | // Symbolic links 395 | 396 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 397 | 398 | NTSYSCALLAPI 399 | NTSTATUS 400 | NTAPI 401 | NtCreateSymbolicLinkObject( 402 | _Out_ PHANDLE LinkHandle, 403 | _In_ ACCESS_MASK DesiredAccess, 404 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 405 | _In_ PUNICODE_STRING LinkTarget 406 | ); 407 | 408 | NTSYSCALLAPI 409 | NTSTATUS 410 | NTAPI 411 | NtOpenSymbolicLinkObject( 412 | _Out_ PHANDLE LinkHandle, 413 | _In_ ACCESS_MASK DesiredAccess, 414 | _In_ POBJECT_ATTRIBUTES ObjectAttributes 415 | ); 416 | 417 | NTSYSCALLAPI 418 | NTSTATUS 419 | NTAPI 420 | NtQuerySymbolicLinkObject( 421 | _In_ HANDLE LinkHandle, 422 | _Inout_ PUNICODE_STRING LinkTarget, 423 | _Out_opt_ PULONG ReturnedLength 424 | ); 425 | 426 | typedef enum _SYMBOLIC_LINK_INFO_CLASS 427 | { 428 | SymbolicLinkGlobalInformation = 1, // s: ULONG 429 | SymbolicLinkAccessMask, // s: ACCESS_MASK 430 | MaxnSymbolicLinkInfoClass 431 | } SYMBOLIC_LINK_INFO_CLASS; 432 | 433 | #if (PHNT_VERSION >= PHNT_THRESHOLD) 434 | NTSYSCALLAPI 435 | NTSTATUS 436 | NTAPI 437 | NtSetInformationSymbolicLink( 438 | _In_ HANDLE LinkHandle, 439 | _In_ SYMBOLIC_LINK_INFO_CLASS SymbolicLinkInformationClass, 440 | _In_reads_bytes_(SymbolicLinkInformationLength) PVOID SymbolicLinkInformation, 441 | _In_ ULONG SymbolicLinkInformationLength 442 | ); 443 | #endif 444 | 445 | #endif 446 | 447 | #endif 448 | -------------------------------------------------------------------------------- /pnth/ntpebteb.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTPEBTEB_H 13 | #define _NTPEBTEB_H 14 | 15 | typedef struct _RTL_USER_PROCESS_PARAMETERS *PRTL_USER_PROCESS_PARAMETERS; 16 | typedef struct _RTL_CRITICAL_SECTION *PRTL_CRITICAL_SECTION; 17 | 18 | // private 19 | typedef struct _ACTIVATION_CONTEXT_STACK 20 | { 21 | struct _RTL_ACTIVATION_CONTEXT_STACK_FRAME* ActiveFrame; 22 | LIST_ENTRY FrameListCache; 23 | ULONG Flags; 24 | ULONG NextCookieSequenceNumber; 25 | ULONG StackId; 26 | } ACTIVATION_CONTEXT_STACK, *PACTIVATION_CONTEXT_STACK; 27 | 28 | // private 29 | typedef struct _API_SET_NAMESPACE 30 | { 31 | ULONG Version; 32 | ULONG Size; 33 | ULONG Flags; 34 | ULONG Count; 35 | ULONG EntryOffset; 36 | ULONG HashOffset; 37 | ULONG HashFactor; 38 | } API_SET_NAMESPACE, *PAPI_SET_NAMESPACE; 39 | 40 | // private 41 | typedef struct _API_SET_HASH_ENTRY 42 | { 43 | ULONG Hash; 44 | ULONG Index; 45 | } API_SET_HASH_ENTRY, *PAPI_SET_HASH_ENTRY; 46 | 47 | // private 48 | typedef struct _API_SET_NAMESPACE_ENTRY 49 | { 50 | ULONG Flags; 51 | ULONG NameOffset; 52 | ULONG NameLength; 53 | ULONG HashedLength; 54 | ULONG ValueOffset; 55 | ULONG ValueCount; 56 | } API_SET_NAMESPACE_ENTRY, *PAPI_SET_NAMESPACE_ENTRY; 57 | 58 | // private 59 | typedef struct _API_SET_VALUE_ENTRY 60 | { 61 | ULONG Flags; 62 | ULONG NameOffset; 63 | ULONG NameLength; 64 | ULONG ValueOffset; 65 | ULONG ValueLength; 66 | } API_SET_VALUE_ENTRY, *PAPI_SET_VALUE_ENTRY; 67 | 68 | // symbols 69 | typedef struct _PEB 70 | { 71 | BOOLEAN InheritedAddressSpace; 72 | BOOLEAN ReadImageFileExecOptions; 73 | BOOLEAN BeingDebugged; 74 | union 75 | { 76 | BOOLEAN BitField; 77 | struct 78 | { 79 | BOOLEAN ImageUsesLargePages : 1; 80 | BOOLEAN IsProtectedProcess : 1; 81 | BOOLEAN IsImageDynamicallyRelocated : 1; 82 | BOOLEAN SkipPatchingUser32Forwarders : 1; 83 | BOOLEAN IsPackagedProcess : 1; 84 | BOOLEAN IsAppContainer : 1; 85 | BOOLEAN IsProtectedProcessLight : 1; 86 | BOOLEAN IsLongPathAwareProcess : 1; 87 | }; 88 | }; 89 | 90 | HANDLE Mutant; 91 | 92 | PVOID ImageBaseAddress; 93 | PPEB_LDR_DATA Ldr; 94 | PRTL_USER_PROCESS_PARAMETERS ProcessParameters; 95 | PVOID SubSystemData; 96 | PVOID ProcessHeap; 97 | PRTL_CRITICAL_SECTION FastPebLock; 98 | PSLIST_HEADER AtlThunkSListPtr; 99 | PVOID IFEOKey; 100 | 101 | union 102 | { 103 | ULONG CrossProcessFlags; 104 | struct 105 | { 106 | ULONG ProcessInJob : 1; 107 | ULONG ProcessInitializing : 1; 108 | ULONG ProcessUsingVEH : 1; 109 | ULONG ProcessUsingVCH : 1; 110 | ULONG ProcessUsingFTH : 1; 111 | ULONG ProcessPreviouslyThrottled : 1; 112 | ULONG ProcessCurrentlyThrottled : 1; 113 | ULONG ProcessImagesHotPatched : 1; // REDSTONE5 114 | ULONG ReservedBits0 : 24; 115 | }; 116 | }; 117 | union 118 | { 119 | PVOID KernelCallbackTable; 120 | PVOID UserSharedInfoPtr; 121 | }; 122 | ULONG SystemReserved; 123 | ULONG AtlThunkSListPtr32; 124 | PAPI_SET_NAMESPACE ApiSetMap; 125 | ULONG TlsExpansionCounter; 126 | PVOID TlsBitmap; 127 | ULONG TlsBitmapBits[2]; 128 | 129 | PVOID ReadOnlySharedMemoryBase; 130 | PVOID SharedData; // HotpatchInformation 131 | PVOID *ReadOnlyStaticServerData; 132 | 133 | PVOID AnsiCodePageData; // PCPTABLEINFO 134 | PVOID OemCodePageData; // PCPTABLEINFO 135 | PVOID UnicodeCaseTableData; // PNLSTABLEINFO 136 | 137 | ULONG NumberOfProcessors; 138 | ULONG NtGlobalFlag; 139 | 140 | ULARGE_INTEGER CriticalSectionTimeout; 141 | SIZE_T HeapSegmentReserve; 142 | SIZE_T HeapSegmentCommit; 143 | SIZE_T HeapDeCommitTotalFreeThreshold; 144 | SIZE_T HeapDeCommitFreeBlockThreshold; 145 | 146 | ULONG NumberOfHeaps; 147 | ULONG MaximumNumberOfHeaps; 148 | PVOID *ProcessHeaps; // PHEAP 149 | 150 | PVOID GdiSharedHandleTable; 151 | PVOID ProcessStarterHelper; 152 | ULONG GdiDCAttributeList; 153 | 154 | PRTL_CRITICAL_SECTION LoaderLock; 155 | 156 | ULONG OSMajorVersion; 157 | ULONG OSMinorVersion; 158 | USHORT OSBuildNumber; 159 | USHORT OSCSDVersion; 160 | ULONG OSPlatformId; 161 | ULONG ImageSubsystem; 162 | ULONG ImageSubsystemMajorVersion; 163 | ULONG ImageSubsystemMinorVersion; 164 | KAFFINITY ActiveProcessAffinityMask; 165 | GDI_HANDLE_BUFFER GdiHandleBuffer; 166 | PVOID PostProcessInitRoutine; 167 | 168 | PVOID TlsExpansionBitmap; 169 | ULONG TlsExpansionBitmapBits[32]; 170 | 171 | ULONG SessionId; 172 | 173 | ULARGE_INTEGER AppCompatFlags; 174 | ULARGE_INTEGER AppCompatFlagsUser; 175 | PVOID pShimData; 176 | PVOID AppCompatInfo; // APPCOMPAT_EXE_DATA 177 | 178 | UNICODE_STRING CSDVersion; 179 | 180 | PVOID ActivationContextData; // ACTIVATION_CONTEXT_DATA 181 | PVOID ProcessAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP 182 | PVOID SystemDefaultActivationContextData; // ACTIVATION_CONTEXT_DATA 183 | PVOID SystemAssemblyStorageMap; // ASSEMBLY_STORAGE_MAP 184 | 185 | SIZE_T MinimumStackCommit; 186 | 187 | PVOID SparePointers[2]; // 19H1 (previously FlsCallback to FlsHighIndex) 188 | PVOID PatchLoaderData; 189 | PVOID ChpeV2ProcessInfo; // _CHPEV2_PROCESS_INFO 190 | 191 | ULONG AppModelFeatureState; 192 | ULONG SpareUlongs[2]; 193 | 194 | USHORT ActiveCodePage; 195 | USHORT OemCodePage; 196 | USHORT UseCaseMapping; 197 | USHORT UnusedNlsField; 198 | 199 | PVOID WerRegistrationData; 200 | PVOID WerShipAssertPtr; 201 | 202 | union 203 | { 204 | PVOID pContextData; // WIN7 205 | PVOID pUnused; // WIN10 206 | PVOID EcCodeBitMap; // WIN11 207 | }; 208 | 209 | PVOID pImageHeaderHash; 210 | union 211 | { 212 | ULONG TracingFlags; 213 | struct 214 | { 215 | ULONG HeapTracingEnabled : 1; 216 | ULONG CritSecTracingEnabled : 1; 217 | ULONG LibLoaderTracingEnabled : 1; 218 | ULONG SpareTracingBits : 29; 219 | }; 220 | }; 221 | ULONGLONG CsrServerReadOnlySharedMemoryBase; 222 | PRTL_CRITICAL_SECTION TppWorkerpListLock; 223 | LIST_ENTRY TppWorkerpList; 224 | PVOID WaitOnAddressHashTable[128]; 225 | PVOID TelemetryCoverageHeader; // REDSTONE3 226 | ULONG CloudFileFlags; 227 | ULONG CloudFileDiagFlags; // REDSTONE4 228 | CHAR PlaceholderCompatibilityMode; 229 | CHAR PlaceholderCompatibilityModeReserved[7]; 230 | struct _LEAP_SECOND_DATA *LeapSecondData; // REDSTONE5 231 | union 232 | { 233 | ULONG LeapSecondFlags; 234 | struct 235 | { 236 | ULONG SixtySecondEnabled : 1; 237 | ULONG Reserved : 31; 238 | }; 239 | }; 240 | ULONG NtGlobalFlag2; 241 | ULONGLONG ExtendedFeatureDisableMask; // since WIN11 242 | } PEB, *PPEB; 243 | 244 | #ifdef _WIN64 245 | C_ASSERT(FIELD_OFFSET(PEB, SessionId) == 0x2C0); 246 | //C_ASSERT(sizeof(PEB) == 0x7B0); // REDSTONE3 247 | //C_ASSERT(sizeof(PEB) == 0x7B8); // REDSTONE4 248 | //C_ASSERT(sizeof(PEB) == 0x7C8); // REDSTONE5 // 19H1 249 | C_ASSERT(sizeof(PEB) == 0x7d0); // WIN11 250 | #else 251 | C_ASSERT(FIELD_OFFSET(PEB, SessionId) == 0x1D4); 252 | //C_ASSERT(sizeof(PEB) == 0x468); // REDSTONE3 253 | //C_ASSERT(sizeof(PEB) == 0x470); // REDSTONE4 254 | //C_ASSERT(sizeof(PEB) == 0x480); // REDSTONE5 // 19H1 255 | C_ASSERT(sizeof(PEB) == 0x488); // WIN11 256 | #endif 257 | 258 | #define GDI_BATCH_BUFFER_SIZE 310 259 | 260 | typedef struct _GDI_TEB_BATCH 261 | { 262 | ULONG Offset; 263 | ULONG_PTR HDC; 264 | ULONG Buffer[GDI_BATCH_BUFFER_SIZE]; 265 | } GDI_TEB_BATCH, *PGDI_TEB_BATCH; 266 | 267 | typedef struct _TEB_ACTIVE_FRAME_CONTEXT 268 | { 269 | ULONG Flags; 270 | PCSTR FrameName; 271 | } TEB_ACTIVE_FRAME_CONTEXT, *PTEB_ACTIVE_FRAME_CONTEXT; 272 | 273 | typedef struct _TEB_ACTIVE_FRAME 274 | { 275 | ULONG Flags; 276 | _TEB_ACTIVE_FRAME *Previous; 277 | const TEB_ACTIVE_FRAME_CONTEXT* Context; 278 | } TEB_ACTIVE_FRAME, *PTEB_ACTIVE_FRAME; 279 | 280 | typedef struct _TEB 281 | { 282 | NT_TIB NtTib; 283 | 284 | PVOID EnvironmentPointer; 285 | CLIENT_ID ClientId; 286 | PVOID ActiveRpcHandle; 287 | PVOID ThreadLocalStoragePointer; 288 | PPEB ProcessEnvironmentBlock; 289 | 290 | ULONG LastErrorValue; 291 | ULONG CountOfOwnedCriticalSections; 292 | PVOID CsrClientThread; 293 | PVOID Win32ThreadInfo; 294 | ULONG User32Reserved[26]; 295 | ULONG UserReserved[5]; 296 | PVOID WOW32Reserved; 297 | LCID CurrentLocale; 298 | ULONG FpSoftwareStatusRegister; 299 | PVOID ReservedForDebuggerInstrumentation[16]; 300 | #ifdef _WIN64 301 | PVOID SystemReserved1[30]; 302 | #else 303 | PVOID SystemReserved1[26]; 304 | #endif 305 | 306 | CHAR PlaceholderCompatibilityMode; 307 | BOOLEAN PlaceholderHydrationAlwaysExplicit; 308 | CHAR PlaceholderReserved[10]; 309 | 310 | ULONG ProxiedProcessId; 311 | ACTIVATION_CONTEXT_STACK ActivationStack; 312 | 313 | UCHAR WorkingOnBehalfTicket[8]; 314 | NTSTATUS ExceptionCode; 315 | 316 | PACTIVATION_CONTEXT_STACK ActivationContextStackPointer; 317 | ULONG_PTR InstrumentationCallbackSp; 318 | ULONG_PTR InstrumentationCallbackPreviousPc; 319 | ULONG_PTR InstrumentationCallbackPreviousSp; 320 | #ifdef _WIN64 321 | ULONG TxFsContext; 322 | #endif 323 | 324 | BOOLEAN InstrumentationCallbackDisabled; 325 | #ifdef _WIN64 326 | BOOLEAN UnalignedLoadStoreExceptions; 327 | #endif 328 | #ifndef _WIN64 329 | UCHAR SpareBytes[23]; 330 | ULONG TxFsContext; 331 | #endif 332 | GDI_TEB_BATCH GdiTebBatch; 333 | CLIENT_ID RealClientId; 334 | HANDLE GdiCachedProcessHandle; 335 | ULONG GdiClientPID; 336 | ULONG GdiClientTID; 337 | PVOID GdiThreadLocalInfo; 338 | ULONG_PTR Win32ClientInfo[62]; 339 | PVOID glDispatchTable[233]; 340 | ULONG_PTR glReserved1[29]; 341 | PVOID glReserved2; 342 | PVOID glSectionInfo; 343 | PVOID glSection; 344 | PVOID glTable; 345 | PVOID glCurrentRC; 346 | PVOID glContext; 347 | 348 | NTSTATUS LastStatusValue; 349 | UNICODE_STRING StaticUnicodeString; 350 | WCHAR StaticUnicodeBuffer[261]; 351 | 352 | PVOID DeallocationStack; 353 | PVOID TlsSlots[64]; 354 | LIST_ENTRY TlsLinks; 355 | 356 | PVOID Vdm; 357 | PVOID ReservedForNtRpc; 358 | PVOID DbgSsReserved[2]; 359 | 360 | ULONG HardErrorMode; 361 | #ifdef _WIN64 362 | PVOID Instrumentation[11]; 363 | #else 364 | PVOID Instrumentation[9]; 365 | #endif 366 | GUID ActivityId; 367 | 368 | PVOID SubProcessTag; 369 | PVOID PerflibData; 370 | PVOID EtwTraceData; 371 | PVOID WinSockData; 372 | ULONG GdiBatchCount; 373 | 374 | union 375 | { 376 | PROCESSOR_NUMBER CurrentIdealProcessor; 377 | ULONG IdealProcessorValue; 378 | struct 379 | { 380 | UCHAR ReservedPad0; 381 | UCHAR ReservedPad1; 382 | UCHAR ReservedPad2; 383 | UCHAR IdealProcessor; 384 | }; 385 | }; 386 | 387 | ULONG GuaranteedStackBytes; 388 | PVOID ReservedForPerf; 389 | PVOID ReservedForOle; 390 | ULONG WaitingOnLoaderLock; 391 | PVOID SavedPriorityState; 392 | ULONG_PTR ReservedForCodeCoverage; 393 | PVOID ThreadPoolData; 394 | PVOID *TlsExpansionSlots; 395 | #ifdef _WIN64 396 | PVOID DeallocationBStore; 397 | PVOID BStoreLimit; 398 | #endif 399 | ULONG MuiGeneration; 400 | ULONG IsImpersonating; 401 | PVOID NlsCache; 402 | PVOID pShimData; 403 | ULONG HeapData; 404 | HANDLE CurrentTransactionHandle; 405 | PTEB_ACTIVE_FRAME ActiveFrame; 406 | PVOID FlsData; 407 | 408 | PVOID PreferredLanguages; 409 | PVOID UserPrefLanguages; 410 | PVOID MergedPrefLanguages; 411 | ULONG MuiImpersonation; 412 | 413 | union 414 | { 415 | USHORT CrossTebFlags; 416 | USHORT SpareCrossTebBits : 16; 417 | }; 418 | union 419 | { 420 | USHORT SameTebFlags; 421 | struct 422 | { 423 | USHORT SafeThunkCall : 1; 424 | USHORT InDebugPrint : 1; 425 | USHORT HasFiberData : 1; 426 | USHORT SkipThreadAttach : 1; 427 | USHORT WerInShipAssertCode : 1; 428 | USHORT RanProcessInit : 1; 429 | USHORT ClonedThread : 1; 430 | USHORT SuppressDebugMsg : 1; 431 | USHORT DisableUserStackWalk : 1; 432 | USHORT RtlExceptionAttached : 1; 433 | USHORT InitialThread : 1; 434 | USHORT SessionAware : 1; 435 | USHORT LoadOwner : 1; 436 | USHORT LoaderWorker : 1; 437 | USHORT SkipLoaderInit : 1; 438 | USHORT SkipFileAPIBrokering : 1; 439 | }; 440 | }; 441 | 442 | PVOID TxnScopeEnterCallback; 443 | PVOID TxnScopeExitCallback; 444 | PVOID TxnScopeContext; 445 | ULONG LockCount; 446 | LONG WowTebOffset; 447 | PVOID ResourceRetValue; 448 | PVOID ReservedForWdf; 449 | ULONGLONG ReservedForCrt; 450 | GUID EffectiveContainerId; 451 | ULONGLONG LastSleepCounter; // Win11 452 | ULONG SpinCallCount; 453 | ULONGLONG ExtendedFeatureDisableMask; 454 | } TEB, *PTEB; 455 | 456 | #endif 457 | -------------------------------------------------------------------------------- /pnth/ntpfapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTPFAPI_H 13 | #define _NTPFAPI_H 14 | 15 | // begin_private 16 | 17 | // Prefetch 18 | 19 | typedef enum _PF_BOOT_PHASE_ID 20 | { 21 | PfKernelInitPhase = 0, 22 | PfBootDriverInitPhase = 90, 23 | PfSystemDriverInitPhase = 120, 24 | PfSessionManagerInitPhase = 150, 25 | PfSMRegistryInitPhase = 180, 26 | PfVideoInitPhase = 210, 27 | PfPostVideoInitPhase = 240, 28 | PfBootAcceptedRegistryInitPhase = 270, 29 | PfUserShellReadyPhase = 300, 30 | PfMaxBootPhaseId = 900 31 | } PF_BOOT_PHASE_ID; 32 | 33 | typedef enum _PF_ENABLE_STATUS 34 | { 35 | PfSvNotSpecified, 36 | PfSvEnabled, 37 | PfSvDisabled, 38 | PfSvMaxEnableStatus 39 | } PF_ENABLE_STATUS; 40 | 41 | typedef struct _PF_TRACE_LIMITS 42 | { 43 | ULONG MaxNumPages; 44 | ULONG MaxNumSections; 45 | LONGLONG TimerPeriod; 46 | } PF_TRACE_LIMITS, *PPF_TRACE_LIMITS; 47 | 48 | typedef struct _PF_SYSTEM_PREFETCH_PARAMETERS 49 | { 50 | PF_ENABLE_STATUS EnableStatus[2]; 51 | PF_TRACE_LIMITS TraceLimits[2]; 52 | ULONG MaxNumActiveTraces; 53 | ULONG MaxNumSavedTraces; 54 | WCHAR RootDirPath[32]; 55 | WCHAR HostingApplicationList[128]; 56 | } PF_SYSTEM_PREFETCH_PARAMETERS, *PPF_SYSTEM_PREFETCH_PARAMETERS; 57 | 58 | #define PF_BOOT_CONTROL_VERSION 1 59 | 60 | typedef struct _PF_BOOT_CONTROL 61 | { 62 | ULONG Version; 63 | ULONG DisableBootPrefetching; 64 | } PF_BOOT_CONTROL, *PPF_BOOT_CONTROL; 65 | 66 | typedef enum _PREFETCHER_INFORMATION_CLASS 67 | { 68 | PrefetcherRetrieveTrace = 1, // q: CHAR[] 69 | PrefetcherSystemParameters, // q: PF_SYSTEM_PREFETCH_PARAMETERS 70 | PrefetcherBootPhase, // s: PF_BOOT_PHASE_ID 71 | PrefetcherSpare1, // PrefetcherRetrieveBootLoaderTrace // q: CHAR[] 72 | PrefetcherBootControl, // s: PF_BOOT_CONTROL 73 | PrefetcherScenarioPolicyControl, 74 | PrefetcherSpare2, 75 | PrefetcherAppLaunchScenarioControl, 76 | PrefetcherInformationMax 77 | } PREFETCHER_INFORMATION_CLASS; 78 | 79 | #define PREFETCHER_INFORMATION_VERSION 23 // rev 80 | #define PREFETCHER_INFORMATION_MAGIC ('kuhC') // rev 81 | 82 | typedef struct _PREFETCHER_INFORMATION 83 | { 84 | _In_ ULONG Version; 85 | _In_ ULONG Magic; 86 | _In_ PREFETCHER_INFORMATION_CLASS PrefetcherInformationClass; 87 | _Inout_ PVOID PrefetcherInformation; 88 | _Inout_ ULONG PrefetcherInformationLength; 89 | } PREFETCHER_INFORMATION, *PPREFETCHER_INFORMATION; 90 | 91 | // Superfetch 92 | 93 | typedef struct _PF_SYSTEM_SUPERFETCH_PARAMETERS 94 | { 95 | ULONG EnabledComponents; 96 | ULONG BootID; 97 | ULONG SavedSectInfoTracesMax; 98 | ULONG SavedPageAccessTracesMax; 99 | ULONG ScenarioPrefetchTimeoutStandby; 100 | ULONG ScenarioPrefetchTimeoutHibernate; 101 | ULONG ScenarioPrefetchTimeoutHiberBoot; 102 | } PF_SYSTEM_SUPERFETCH_PARAMETERS, *PPF_SYSTEM_SUPERFETCH_PARAMETERS; 103 | 104 | #define PF_PFN_PRIO_REQUEST_VERSION 1 105 | #define PF_PFN_PRIO_REQUEST_QUERY_MEMORY_LIST 0x1 106 | #define PF_PFN_PRIO_REQUEST_VALID_FLAGS 0x1 107 | 108 | typedef struct _PF_PFN_PRIO_REQUEST 109 | { 110 | ULONG Version; 111 | ULONG RequestFlags; 112 | ULONG_PTR PfnCount; 113 | SYSTEM_MEMORY_LIST_INFORMATION MemInfo; 114 | MMPFN_IDENTITY PageData[256]; 115 | } PF_PFN_PRIO_REQUEST, *PPF_PFN_PRIO_REQUEST; 116 | 117 | typedef enum _PFS_PRIVATE_PAGE_SOURCE_TYPE 118 | { 119 | PfsPrivateSourceKernel, 120 | PfsPrivateSourceSession, 121 | PfsPrivateSourceProcess, 122 | PfsPrivateSourceMax 123 | } PFS_PRIVATE_PAGE_SOURCE_TYPE; 124 | 125 | typedef struct _PFS_PRIVATE_PAGE_SOURCE 126 | { 127 | PFS_PRIVATE_PAGE_SOURCE_TYPE Type; 128 | union 129 | { 130 | ULONG SessionId; 131 | ULONG ProcessId; 132 | }; 133 | ULONG ImagePathHash; 134 | ULONG_PTR UniqueProcessHash; 135 | } PFS_PRIVATE_PAGE_SOURCE, *PPFS_PRIVATE_PAGE_SOURCE; 136 | 137 | typedef struct _PF_PRIVSOURCE_INFO 138 | { 139 | PFS_PRIVATE_PAGE_SOURCE DbInfo; 140 | PVOID EProcess; 141 | SIZE_T WsPrivatePages; 142 | SIZE_T TotalPrivatePages; 143 | ULONG SessionID; 144 | CHAR ImageName[16]; 145 | union { 146 | ULONG_PTR WsSwapPages; // process only PF_PRIVSOURCE_QUERY_WS_SWAP_PAGES. 147 | ULONG_PTR SessionPagedPoolPages; // session only. 148 | ULONG_PTR StoreSizePages; // process only PF_PRIVSOURCE_QUERY_STORE_INFO. 149 | }; 150 | ULONG_PTR WsTotalPages; // process/session only. 151 | ULONG DeepFreezeTimeMs; // process only. 152 | ULONG ModernApp : 1; // process only. 153 | ULONG DeepFrozen : 1; // process only. If set, DeepFreezeTimeMs contains the time at which the freeze occurred 154 | ULONG Foreground : 1; // process only. 155 | ULONG PerProcessStore : 1; // process only. 156 | ULONG Spare : 28; 157 | } PF_PRIVSOURCE_INFO, *PPF_PRIVSOURCE_INFO; 158 | 159 | #define PF_PRIVSOURCE_QUERY_REQUEST_VERSION 8 160 | 161 | typedef struct _PF_PRIVSOURCE_QUERY_REQUEST 162 | { 163 | ULONG Version; 164 | ULONG Flags; 165 | ULONG InfoCount; 166 | PF_PRIVSOURCE_INFO InfoArray[1]; 167 | } PF_PRIVSOURCE_QUERY_REQUEST, *PPF_PRIVSOURCE_QUERY_REQUEST; 168 | 169 | typedef enum _PF_PHASED_SCENARIO_TYPE 170 | { 171 | PfScenarioTypeNone, 172 | PfScenarioTypeStandby, 173 | PfScenarioTypeHibernate, 174 | PfScenarioTypeFUS, 175 | PfScenarioTypeMax 176 | } PF_PHASED_SCENARIO_TYPE; 177 | 178 | #define PF_SCENARIO_PHASE_INFO_VERSION 4 179 | 180 | typedef struct _PF_SCENARIO_PHASE_INFO 181 | { 182 | ULONG Version; 183 | PF_PHASED_SCENARIO_TYPE ScenType; 184 | ULONG PhaseId; 185 | ULONG SequenceNumber; 186 | ULONG Flags; 187 | ULONG FUSUserId; 188 | } PF_SCENARIO_PHASE_INFO, *PPF_SCENARIO_PHASE_INFO; 189 | 190 | typedef struct _PF_MEMORY_LIST_NODE 191 | { 192 | ULONGLONG Node : 8; 193 | ULONGLONG Spare : 56; 194 | ULONGLONG StandbyLowPageCount; 195 | ULONGLONG StandbyMediumPageCount; 196 | ULONGLONG StandbyHighPageCount; 197 | ULONGLONG FreePageCount; 198 | ULONGLONG ModifiedPageCount; 199 | } PF_MEMORY_LIST_NODE, *PPF_MEMORY_LIST_NODE; 200 | 201 | #define PF_MEMORY_LIST_INFO_VERSION 1 202 | 203 | typedef struct _PF_MEMORY_LIST_INFO 204 | { 205 | ULONG Version; 206 | ULONG Size; 207 | ULONG NodeCount; 208 | PF_MEMORY_LIST_NODE Nodes[1]; 209 | } PF_MEMORY_LIST_INFO, *PPF_MEMORY_LIST_INFO; 210 | 211 | typedef struct _PF_PHYSICAL_MEMORY_RANGE 212 | { 213 | ULONG_PTR BasePfn; 214 | ULONG_PTR PageCount; 215 | } PF_PHYSICAL_MEMORY_RANGE, *PPF_PHYSICAL_MEMORY_RANGE; 216 | 217 | #define PF_PHYSICAL_MEMORY_RANGE_INFO_V1_VERSION 1 218 | 219 | typedef struct _PF_PHYSICAL_MEMORY_RANGE_INFO_V1 220 | { 221 | ULONG Version; 222 | ULONG RangeCount; 223 | PF_PHYSICAL_MEMORY_RANGE Ranges[1]; 224 | } PF_PHYSICAL_MEMORY_RANGE_INFO_V1, *PPF_PHYSICAL_MEMORY_RANGE_INFO_V1; 225 | 226 | #define PF_PHYSICAL_MEMORY_RANGE_INFO_V2_VERSION 2 227 | 228 | typedef struct _PF_PHYSICAL_MEMORY_RANGE_INFO_V2 229 | { 230 | ULONG Version; 231 | ULONG Flags; 232 | ULONG RangeCount; 233 | PF_PHYSICAL_MEMORY_RANGE Ranges[ANYSIZE_ARRAY]; 234 | } PF_PHYSICAL_MEMORY_RANGE_INFO_V2, *PPF_PHYSICAL_MEMORY_RANGE_INFO_V2; 235 | 236 | // begin_rev 237 | 238 | #define PF_REPURPOSED_BY_PREFETCH_INFO_VERSION 1 239 | 240 | typedef struct _PF_REPURPOSED_BY_PREFETCH_INFO 241 | { 242 | ULONG Version; 243 | ULONG RepurposedByPrefetch; 244 | } PF_REPURPOSED_BY_PREFETCH_INFO, *PPF_REPURPOSED_BY_PREFETCH_INFO; 245 | 246 | // end_rev 247 | 248 | typedef enum _SUPERFETCH_INFORMATION_CLASS 249 | { 250 | SuperfetchRetrieveTrace = 1, // q: CHAR[] 251 | SuperfetchSystemParameters, // q: PF_SYSTEM_SUPERFETCH_PARAMETERS 252 | SuperfetchLogEvent, 253 | SuperfetchGenerateTrace, 254 | SuperfetchPrefetch, 255 | SuperfetchPfnQuery, // q: PF_PFN_PRIO_REQUEST 256 | SuperfetchPfnSetPriority, 257 | SuperfetchPrivSourceQuery, // q: PF_PRIVSOURCE_QUERY_REQUEST 258 | SuperfetchSequenceNumberQuery, // q: ULONG 259 | SuperfetchScenarioPhase, // 10 260 | SuperfetchWorkerPriority, 261 | SuperfetchScenarioQuery, // q: PF_SCENARIO_PHASE_INFO 262 | SuperfetchScenarioPrefetch, 263 | SuperfetchRobustnessControl, 264 | SuperfetchTimeControl, 265 | SuperfetchMemoryListQuery, // q: PF_MEMORY_LIST_INFO 266 | SuperfetchMemoryRangesQuery, // q: PF_PHYSICAL_MEMORY_RANGE_INFO 267 | SuperfetchTracingControl, 268 | SuperfetchTrimWhileAgingControl, 269 | SuperfetchRepurposedByPrefetch, // q: PF_REPURPOSED_BY_PREFETCH_INFO // rev 270 | SuperfetchChannelPowerRequest, 271 | SuperfetchMovePages, 272 | SuperfetchVirtualQuery, 273 | SuperfetchCombineStatsQuery, 274 | SuperfetchSetMinWsAgeRate, 275 | SuperfetchDeprioritizeOldPagesInWs, 276 | SuperfetchFileExtentsQuery, 277 | SuperfetchGpuUtilizationQuery, // PF_GPU_UTILIZATION_INFO 278 | SuperfetchInformationMax 279 | } SUPERFETCH_INFORMATION_CLASS; 280 | 281 | #define SUPERFETCH_INFORMATION_VERSION 45 // rev 282 | #define SUPERFETCH_INFORMATION_MAGIC ('kuhC') // rev 283 | 284 | typedef struct _SUPERFETCH_INFORMATION 285 | { 286 | _In_ ULONG Version; 287 | _In_ ULONG Magic; 288 | _In_ SUPERFETCH_INFORMATION_CLASS SuperfetchInformationClass; 289 | _Inout_ PVOID SuperfetchInformation; 290 | _Inout_ ULONG SuperfetchInformationLength; 291 | } SUPERFETCH_INFORMATION, *PSUPERFETCH_INFORMATION; 292 | 293 | // end_private 294 | 295 | #endif 296 | -------------------------------------------------------------------------------- /pnth/ntpnpapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTPNPAPI_H 13 | #define _NTPNPAPI_H 14 | 15 | typedef enum _PLUGPLAY_EVENT_CATEGORY 16 | { 17 | HardwareProfileChangeEvent, 18 | TargetDeviceChangeEvent, 19 | DeviceClassChangeEvent, 20 | CustomDeviceEvent, 21 | DeviceInstallEvent, 22 | DeviceArrivalEvent, 23 | PowerEvent, 24 | VetoEvent, 25 | BlockedDriverEvent, 26 | InvalidIDEvent, 27 | MaxPlugEventCategory 28 | } PLUGPLAY_EVENT_CATEGORY, *PPLUGPLAY_EVENT_CATEGORY; 29 | 30 | typedef struct _PLUGPLAY_EVENT_BLOCK 31 | { 32 | GUID EventGuid; 33 | PLUGPLAY_EVENT_CATEGORY EventCategory; 34 | PULONG Result; 35 | ULONG Flags; 36 | ULONG TotalSize; 37 | PVOID DeviceObject; 38 | 39 | union 40 | { 41 | struct 42 | { 43 | GUID ClassGuid; 44 | WCHAR SymbolicLinkName[1]; 45 | } DeviceClass; 46 | struct 47 | { 48 | WCHAR DeviceIds[1]; 49 | } TargetDevice; 50 | struct 51 | { 52 | WCHAR DeviceId[1]; 53 | } InstallDevice; 54 | struct 55 | { 56 | PVOID NotificationStructure; 57 | WCHAR DeviceIds[1]; 58 | } CustomNotification; 59 | struct 60 | { 61 | PVOID Notification; 62 | } ProfileNotification; 63 | struct 64 | { 65 | ULONG NotificationCode; 66 | ULONG NotificationData; 67 | } PowerNotification; 68 | struct 69 | { 70 | PNP_VETO_TYPE VetoType; 71 | WCHAR DeviceIdVetoNameBuffer[1]; // DeviceIdVetoName 72 | } VetoNotification; 73 | struct 74 | { 75 | GUID BlockedDriverGuid; 76 | } BlockedDriverNotification; 77 | struct 78 | { 79 | WCHAR ParentId[1]; 80 | } InvalidIDNotification; 81 | } u; 82 | } PLUGPLAY_EVENT_BLOCK, *PPLUGPLAY_EVENT_BLOCK; 83 | 84 | typedef enum _PLUGPLAY_CONTROL_CLASS 85 | { 86 | PlugPlayControlEnumerateDevice, // PLUGPLAY_CONTROL_ENUMERATE_DEVICE_DATA 87 | PlugPlayControlRegisterNewDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 88 | PlugPlayControlDeregisterDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 89 | PlugPlayControlInitializeDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 90 | PlugPlayControlStartDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 91 | PlugPlayControlUnlockDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 92 | PlugPlayControlQueryAndRemoveDevice, // PLUGPLAY_CONTROL_QUERY_AND_REMOVE_DATA 93 | PlugPlayControlUserResponse, // PLUGPLAY_CONTROL_USER_RESPONSE_DATA 94 | PlugPlayControlGenerateLegacyDevice, // PLUGPLAY_CONTROL_LEGACY_DEVGEN_DATA 95 | PlugPlayControlGetInterfaceDeviceList, // PLUGPLAY_CONTROL_INTERFACE_LIST_DATA 96 | PlugPlayControlProperty, // PLUGPLAY_CONTROL_PROPERTY_DATA 97 | PlugPlayControlDeviceClassAssociation, // PLUGPLAY_CONTROL_CLASS_ASSOCIATION_DATA 98 | PlugPlayControlGetRelatedDevice, // PLUGPLAY_CONTROL_RELATED_DEVICE_DATA 99 | PlugPlayControlGetInterfaceDeviceAlias, // PLUGPLAY_CONTROL_INTERFACE_ALIAS_DATA 100 | PlugPlayControlDeviceStatus, // PLUGPLAY_CONTROL_STATUS_DATA 101 | PlugPlayControlGetDeviceDepth, // PLUGPLAY_CONTROL_DEPTH_DATA 102 | PlugPlayControlQueryDeviceRelations, // PLUGPLAY_CONTROL_DEVICE_RELATIONS_DATA 103 | PlugPlayControlTargetDeviceRelation, // PLUGPLAY_CONTROL_TARGET_RELATION_DATA 104 | PlugPlayControlQueryConflictList, // PLUGPLAY_CONTROL_CONFLICT_LIST 105 | PlugPlayControlRetrieveDock, // PLUGPLAY_CONTROL_RETRIEVE_DOCK_DATA 106 | PlugPlayControlResetDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 107 | PlugPlayControlHaltDevice, // PLUGPLAY_CONTROL_DEVICE_CONTROL_DATA 108 | PlugPlayControlGetBlockedDriverList, // PLUGPLAY_CONTROL_BLOCKED_DRIVER_DATA 109 | PlugPlayControlGetDeviceInterfaceEnabled, // PLUGPLAY_CONTROL_DEVICE_INTERFACE_ENABLED 110 | MaxPlugPlayControl 111 | } PLUGPLAY_CONTROL_CLASS, *PPLUGPLAY_CONTROL_CLASS; 112 | 113 | #if (PHNT_VERSION < PHNT_WIN8) 114 | NTSYSCALLAPI 115 | NTSTATUS 116 | NTAPI 117 | NtGetPlugPlayEvent( 118 | _In_ HANDLE EventHandle, 119 | _In_opt_ PVOID Context, 120 | _Out_writes_bytes_(EventBufferSize) PPLUGPLAY_EVENT_BLOCK EventBlock, 121 | _In_ ULONG EventBufferSize 122 | ); 123 | #endif 124 | 125 | NTSYSCALLAPI 126 | NTSTATUS 127 | NTAPI 128 | NtPlugPlayControl( 129 | _In_ PLUGPLAY_CONTROL_CLASS PnPControlClass, 130 | _Inout_updates_bytes_(PnPControlDataLength) PVOID PnPControlData, 131 | _In_ ULONG PnPControlDataLength 132 | ); 133 | 134 | #if (PHNT_VERSION >= PHNT_WIN7) 135 | 136 | NTSYSCALLAPI 137 | NTSTATUS 138 | NTAPI 139 | NtSerializeBoot( 140 | VOID 141 | ); 142 | 143 | NTSYSCALLAPI 144 | NTSTATUS 145 | NTAPI 146 | NtEnableLastKnownGood( 147 | VOID 148 | ); 149 | 150 | NTSYSCALLAPI 151 | NTSTATUS 152 | NTAPI 153 | NtDisableLastKnownGood( 154 | VOID 155 | ); 156 | 157 | #endif 158 | 159 | #if (PHNT_VERSION >= PHNT_VISTA) 160 | NTSYSCALLAPI 161 | NTSTATUS 162 | NTAPI 163 | NtReplacePartitionUnit( 164 | _In_ PUNICODE_STRING TargetInstancePath, 165 | _In_ PUNICODE_STRING SpareInstancePath, 166 | _In_ ULONG Flags 167 | ); 168 | #endif 169 | 170 | #endif 171 | -------------------------------------------------------------------------------- /pnth/ntregapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTREGAPI_H 13 | #define _NTREGAPI_H 14 | 15 | // Boot condition flags (NtInitializeRegistry) 16 | 17 | #define REG_INIT_BOOT_SM 0x0000 18 | #define REG_INIT_BOOT_SETUP 0x0001 19 | #define REG_INIT_BOOT_ACCEPTED_BASE 0x0002 20 | #define REG_INIT_BOOT_ACCEPTED_MAX REG_INIT_BOOT_ACCEPTED_BASE + 999 21 | 22 | #define REG_MAX_KEY_VALUE_NAME_LENGTH 32767 23 | #define REG_MAX_KEY_NAME_LENGTH 512 24 | 25 | typedef enum _KEY_INFORMATION_CLASS 26 | { 27 | KeyBasicInformation, // KEY_BASIC_INFORMATION 28 | KeyNodeInformation, // KEY_NODE_INFORMATION 29 | KeyFullInformation, // KEY_FULL_INFORMATION 30 | KeyNameInformation, // KEY_NAME_INFORMATION 31 | KeyCachedInformation, // KEY_CACHED_INFORMATION 32 | KeyFlagsInformation, // KEY_FLAGS_INFORMATION 33 | KeyVirtualizationInformation, // KEY_VIRTUALIZATION_INFORMATION 34 | KeyHandleTagsInformation, // KEY_HANDLE_TAGS_INFORMATION 35 | KeyTrustInformation, // KEY_TRUST_INFORMATION 36 | KeyLayerInformation, // KEY_LAYER_INFORMATION 37 | MaxKeyInfoClass 38 | } KEY_INFORMATION_CLASS; 39 | 40 | typedef struct _KEY_BASIC_INFORMATION 41 | { 42 | LARGE_INTEGER LastWriteTime; 43 | ULONG TitleIndex; 44 | ULONG NameLength; 45 | WCHAR Name[1]; 46 | } KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION; 47 | 48 | typedef struct _KEY_NODE_INFORMATION 49 | { 50 | LARGE_INTEGER LastWriteTime; 51 | ULONG TitleIndex; 52 | ULONG ClassOffset; 53 | ULONG ClassLength; 54 | ULONG NameLength; 55 | WCHAR Name[1]; 56 | // ... 57 | // WCHAR Class[1]; 58 | } KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION; 59 | 60 | typedef struct _KEY_FULL_INFORMATION 61 | { 62 | LARGE_INTEGER LastWriteTime; 63 | ULONG TitleIndex; 64 | ULONG ClassOffset; 65 | ULONG ClassLength; 66 | ULONG SubKeys; 67 | ULONG MaxNameLen; 68 | ULONG MaxClassLen; 69 | ULONG Values; 70 | ULONG MaxValueNameLen; 71 | ULONG MaxValueDataLen; 72 | WCHAR Class[1]; 73 | } KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION; 74 | 75 | typedef struct _KEY_NAME_INFORMATION 76 | { 77 | ULONG NameLength; 78 | WCHAR Name[1]; 79 | } KEY_NAME_INFORMATION, *PKEY_NAME_INFORMATION; 80 | 81 | typedef struct _KEY_CACHED_INFORMATION 82 | { 83 | LARGE_INTEGER LastWriteTime; 84 | ULONG TitleIndex; 85 | ULONG SubKeys; 86 | ULONG MaxNameLen; 87 | ULONG Values; 88 | ULONG MaxValueNameLen; 89 | ULONG MaxValueDataLen; 90 | ULONG NameLength; 91 | WCHAR Name[1]; 92 | } KEY_CACHED_INFORMATION, *PKEY_CACHED_INFORMATION; 93 | 94 | // rev 95 | #define REG_FLAG_VOLATILE 0x0001 96 | #define REG_FLAG_LINK 0x0002 97 | 98 | // msdn 99 | #define REG_KEY_DONT_VIRTUALIZE 0x0002 100 | #define REG_KEY_DONT_SILENT_FAIL 0x0004 101 | #define REG_KEY_RECURSE_FLAG 0x0008 102 | 103 | // private 104 | typedef struct _KEY_FLAGS_INFORMATION 105 | { 106 | ULONG Wow64Flags; 107 | ULONG KeyFlags; // REG_FLAG_* 108 | ULONG ControlFlags; // REG_KEY_* 109 | } KEY_FLAGS_INFORMATION, *PKEY_FLAGS_INFORMATION; 110 | 111 | typedef struct _KEY_VIRTUALIZATION_INFORMATION 112 | { 113 | ULONG VirtualizationCandidate : 1; // Tells whether the key is part of the virtualization namespace scope (only HKLM\Software for now). 114 | ULONG VirtualizationEnabled : 1; // Tells whether virtualization is enabled on this key. Can be 1 only if above flag is 1. 115 | ULONG VirtualTarget : 1; // Tells if the key is a virtual key. Can be 1 only if above 2 are 0. Valid only on the virtual store key handles. 116 | ULONG VirtualStore : 1; // Tells if the key is a part of the virtual store path. Valid only on the virtual store key handles. 117 | ULONG VirtualSource : 1; // Tells if the key has ever been virtualized, can be 1 only if VirtualizationCandidate is 1. 118 | ULONG Reserved : 27; 119 | } KEY_VIRTUALIZATION_INFORMATION, *PKEY_VIRTUALIZATION_INFORMATION; 120 | 121 | // private 122 | typedef struct _KEY_TRUST_INFORMATION 123 | { 124 | ULONG TrustedKey : 1; 125 | ULONG Reserved : 31; 126 | } KEY_TRUST_INFORMATION, *PKEY_TRUST_INFORMATION; 127 | 128 | // private 129 | typedef struct _KEY_LAYER_INFORMATION 130 | { 131 | ULONG IsTombstone : 1; 132 | ULONG IsSupersedeLocal : 1; 133 | ULONG IsSupersedeTree : 1; 134 | ULONG ClassIsInherited : 1; 135 | ULONG Reserved : 28; 136 | } KEY_LAYER_INFORMATION, *PKEY_LAYER_INFORMATION; 137 | 138 | typedef enum _KEY_SET_INFORMATION_CLASS 139 | { 140 | KeyWriteTimeInformation, // KEY_WRITE_TIME_INFORMATION 141 | KeyWow64FlagsInformation, // KEY_WOW64_FLAGS_INFORMATION 142 | KeyControlFlagsInformation, // KEY_CONTROL_FLAGS_INFORMATION 143 | KeySetVirtualizationInformation, // KEY_SET_VIRTUALIZATION_INFORMATION 144 | KeySetDebugInformation, 145 | KeySetHandleTagsInformation, // KEY_HANDLE_TAGS_INFORMATION 146 | KeySetLayerInformation, // KEY_SET_LAYER_INFORMATION 147 | MaxKeySetInfoClass 148 | } KEY_SET_INFORMATION_CLASS; 149 | 150 | typedef struct _KEY_WRITE_TIME_INFORMATION 151 | { 152 | LARGE_INTEGER LastWriteTime; 153 | } KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION; 154 | 155 | typedef struct _KEY_WOW64_FLAGS_INFORMATION 156 | { 157 | ULONG UserFlags; 158 | } KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION; 159 | 160 | typedef struct _KEY_HANDLE_TAGS_INFORMATION 161 | { 162 | ULONG HandleTags; 163 | } KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION; 164 | 165 | typedef struct _KEY_SET_LAYER_INFORMATION 166 | { 167 | ULONG IsTombstone : 1; 168 | ULONG IsSupersedeLocal : 1; 169 | ULONG IsSupersedeTree : 1; 170 | ULONG ClassIsInherited : 1; 171 | ULONG Reserved : 28; 172 | } KEY_SET_LAYER_INFORMATION, *PKEY_SET_LAYER_INFORMATION; 173 | 174 | typedef struct _KEY_CONTROL_FLAGS_INFORMATION 175 | { 176 | ULONG ControlFlags; 177 | } KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION; 178 | 179 | typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION 180 | { 181 | ULONG VirtualTarget : 1; 182 | ULONG VirtualStore : 1; 183 | ULONG VirtualSource : 1; // true if key has been virtualized at least once 184 | ULONG Reserved : 29; 185 | } KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION; 186 | 187 | typedef enum _KEY_VALUE_INFORMATION_CLASS 188 | { 189 | KeyValueBasicInformation, // KEY_VALUE_BASIC_INFORMATION 190 | KeyValueFullInformation, // KEY_VALUE_FULL_INFORMATION 191 | KeyValuePartialInformation, // KEY_VALUE_PARTIAL_INFORMATION 192 | KeyValueFullInformationAlign64, 193 | KeyValuePartialInformationAlign64, // KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 194 | KeyValueLayerInformation, // KEY_VALUE_LAYER_INFORMATION 195 | MaxKeyValueInfoClass 196 | } KEY_VALUE_INFORMATION_CLASS; 197 | 198 | typedef struct _KEY_VALUE_BASIC_INFORMATION 199 | { 200 | ULONG TitleIndex; 201 | ULONG Type; 202 | ULONG NameLength; 203 | WCHAR Name[1]; 204 | } KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION; 205 | 206 | typedef struct _KEY_VALUE_FULL_INFORMATION 207 | { 208 | ULONG TitleIndex; 209 | ULONG Type; 210 | ULONG DataOffset; 211 | ULONG DataLength; 212 | ULONG NameLength; 213 | WCHAR Name[1]; 214 | // ... 215 | // UCHAR Data[1]; 216 | } KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION; 217 | 218 | typedef struct _KEY_VALUE_PARTIAL_INFORMATION 219 | { 220 | ULONG TitleIndex; 221 | ULONG Type; 222 | ULONG DataLength; 223 | UCHAR Data[1]; 224 | } KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION; 225 | 226 | typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 227 | { 228 | ULONG Type; 229 | ULONG DataLength; 230 | UCHAR Data[1]; 231 | } KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64; 232 | 233 | // private 234 | typedef struct _KEY_VALUE_LAYER_INFORMATION 235 | { 236 | ULONG IsTombstone : 1; 237 | ULONG Reserved : 31; 238 | } KEY_VALUE_LAYER_INFORMATION, *PKEY_VALUE_LAYER_INFORMATION; 239 | 240 | // rev 241 | typedef enum _KEY_LOAD_ENTRY_TYPE 242 | { 243 | KeyLoadTrustClassKey = 1, 244 | KeyLoadEvent, 245 | KeyLoadToken 246 | } KEY_LOAD_ENTRY_TYPE; 247 | 248 | // rev 249 | typedef struct _KEY_LOAD_ENTRY 250 | { 251 | KEY_LOAD_ENTRY_TYPE EntryType; 252 | union 253 | { 254 | HANDLE Handle; 255 | ULONG_PTR Value; 256 | }; 257 | } KEY_LOAD_ENTRY, *PKEY_LOAD_ENTRY; 258 | 259 | typedef struct _KEY_VALUE_ENTRY 260 | { 261 | PUNICODE_STRING ValueName; 262 | ULONG DataLength; 263 | ULONG DataOffset; 264 | ULONG Type; 265 | } KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY; 266 | 267 | typedef enum _REG_ACTION 268 | { 269 | KeyAdded, 270 | KeyRemoved, 271 | KeyModified 272 | } REG_ACTION; 273 | 274 | typedef struct _REG_NOTIFY_INFORMATION 275 | { 276 | ULONG NextEntryOffset; 277 | REG_ACTION Action; 278 | ULONG KeyLength; 279 | WCHAR Key[1]; 280 | } REG_NOTIFY_INFORMATION, *PREG_NOTIFY_INFORMATION; 281 | 282 | typedef struct _KEY_PID_ARRAY 283 | { 284 | HANDLE ProcessId; 285 | UNICODE_STRING KeyName; 286 | } KEY_PID_ARRAY, *PKEY_PID_ARRAY; 287 | 288 | typedef struct _KEY_OPEN_SUBKEYS_INFORMATION 289 | { 290 | ULONG Count; 291 | KEY_PID_ARRAY KeyArray[1]; 292 | } KEY_OPEN_SUBKEYS_INFORMATION, *PKEY_OPEN_SUBKEYS_INFORMATION; 293 | 294 | // System calls 295 | 296 | NTSYSCALLAPI 297 | NTSTATUS 298 | NTAPI 299 | NtCreateKey( 300 | _Out_ PHANDLE KeyHandle, 301 | _In_ ACCESS_MASK DesiredAccess, 302 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 303 | _Reserved_ ULONG TitleIndex, 304 | _In_opt_ PUNICODE_STRING Class, 305 | _In_ ULONG CreateOptions, 306 | _Out_opt_ PULONG Disposition 307 | ); 308 | 309 | #if (PHNT_VERSION >= PHNT_VISTA) 310 | NTSYSCALLAPI 311 | NTSTATUS 312 | NTAPI 313 | NtCreateKeyTransacted( 314 | _Out_ PHANDLE KeyHandle, 315 | _In_ ACCESS_MASK DesiredAccess, 316 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 317 | _Reserved_ ULONG TitleIndex, 318 | _In_opt_ PUNICODE_STRING Class, 319 | _In_ ULONG CreateOptions, 320 | _In_ HANDLE TransactionHandle, 321 | _Out_opt_ PULONG Disposition 322 | ); 323 | #endif 324 | 325 | NTSYSCALLAPI 326 | NTSTATUS 327 | NTAPI 328 | NtOpenKey( 329 | _Out_ PHANDLE KeyHandle, 330 | _In_ ACCESS_MASK DesiredAccess, 331 | _In_ POBJECT_ATTRIBUTES ObjectAttributes 332 | ); 333 | 334 | #if (PHNT_VERSION >= PHNT_VISTA) 335 | NTSYSCALLAPI 336 | NTSTATUS 337 | NTAPI 338 | NtOpenKeyTransacted( 339 | _Out_ PHANDLE KeyHandle, 340 | _In_ ACCESS_MASK DesiredAccess, 341 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 342 | _In_ HANDLE TransactionHandle 343 | ); 344 | #endif 345 | 346 | #if (PHNT_VERSION >= PHNT_WIN7) 347 | NTSYSCALLAPI 348 | NTSTATUS 349 | NTAPI 350 | NtOpenKeyEx( 351 | _Out_ PHANDLE KeyHandle, 352 | _In_ ACCESS_MASK DesiredAccess, 353 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 354 | _In_ ULONG OpenOptions 355 | ); 356 | #endif 357 | 358 | #if (PHNT_VERSION >= PHNT_WIN7) 359 | NTSYSCALLAPI 360 | NTSTATUS 361 | NTAPI 362 | NtOpenKeyTransactedEx( 363 | _Out_ PHANDLE KeyHandle, 364 | _In_ ACCESS_MASK DesiredAccess, 365 | _In_ POBJECT_ATTRIBUTES ObjectAttributes, 366 | _In_ ULONG OpenOptions, 367 | _In_ HANDLE TransactionHandle 368 | ); 369 | #endif 370 | 371 | NTSYSCALLAPI 372 | NTSTATUS 373 | NTAPI 374 | NtDeleteKey( 375 | _In_ HANDLE KeyHandle 376 | ); 377 | 378 | NTSYSCALLAPI 379 | NTSTATUS 380 | NTAPI 381 | NtRenameKey( 382 | _In_ HANDLE KeyHandle, 383 | _In_ PUNICODE_STRING NewName 384 | ); 385 | 386 | NTSYSCALLAPI 387 | NTSTATUS 388 | NTAPI 389 | NtDeleteValueKey( 390 | _In_ HANDLE KeyHandle, 391 | _In_ PUNICODE_STRING ValueName 392 | ); 393 | 394 | NTSYSCALLAPI 395 | NTSTATUS 396 | NTAPI 397 | NtQueryKey( 398 | _In_ HANDLE KeyHandle, 399 | _In_ KEY_INFORMATION_CLASS KeyInformationClass, 400 | _Out_writes_bytes_opt_(Length) PVOID KeyInformation, 401 | _In_ ULONG Length, 402 | _Out_ PULONG ResultLength 403 | ); 404 | 405 | NTSYSCALLAPI 406 | NTSTATUS 407 | NTAPI 408 | NtSetInformationKey( 409 | _In_ HANDLE KeyHandle, 410 | _In_ KEY_SET_INFORMATION_CLASS KeySetInformationClass, 411 | _In_reads_bytes_(KeySetInformationLength) PVOID KeySetInformation, 412 | _In_ ULONG KeySetInformationLength 413 | ); 414 | 415 | NTSYSCALLAPI 416 | NTSTATUS 417 | NTAPI 418 | NtQueryValueKey( 419 | _In_ HANDLE KeyHandle, 420 | _In_ PUNICODE_STRING ValueName, 421 | _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, 422 | _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, 423 | _In_ ULONG Length, 424 | _Out_ PULONG ResultLength 425 | ); 426 | 427 | NTSYSCALLAPI 428 | NTSTATUS 429 | NTAPI 430 | NtSetValueKey( 431 | _In_ HANDLE KeyHandle, 432 | _In_ PUNICODE_STRING ValueName, 433 | _In_opt_ ULONG TitleIndex, 434 | _In_ ULONG Type, 435 | _In_reads_bytes_opt_(DataSize) PVOID Data, 436 | _In_ ULONG DataSize 437 | ); 438 | 439 | NTSYSCALLAPI 440 | NTSTATUS 441 | NTAPI 442 | NtQueryMultipleValueKey( 443 | _In_ HANDLE KeyHandle, 444 | _Inout_updates_(EntryCount) PKEY_VALUE_ENTRY ValueEntries, 445 | _In_ ULONG EntryCount, 446 | _Out_writes_bytes_(*BufferLength) PVOID ValueBuffer, 447 | _Inout_ PULONG BufferLength, 448 | _Out_opt_ PULONG RequiredBufferLength 449 | ); 450 | 451 | NTSYSCALLAPI 452 | NTSTATUS 453 | NTAPI 454 | NtEnumerateKey( 455 | _In_ HANDLE KeyHandle, 456 | _In_ ULONG Index, 457 | _In_ KEY_INFORMATION_CLASS KeyInformationClass, 458 | _Out_writes_bytes_opt_(Length) PVOID KeyInformation, 459 | _In_ ULONG Length, 460 | _Out_ PULONG ResultLength 461 | ); 462 | 463 | NTSYSCALLAPI 464 | NTSTATUS 465 | NTAPI 466 | NtEnumerateValueKey( 467 | _In_ HANDLE KeyHandle, 468 | _In_ ULONG Index, 469 | _In_ KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass, 470 | _Out_writes_bytes_opt_(Length) PVOID KeyValueInformation, 471 | _In_ ULONG Length, 472 | _Out_ PULONG ResultLength 473 | ); 474 | 475 | NTSYSCALLAPI 476 | NTSTATUS 477 | NTAPI 478 | NtFlushKey( 479 | _In_ HANDLE KeyHandle 480 | ); 481 | 482 | NTSYSCALLAPI 483 | NTSTATUS 484 | NTAPI 485 | NtCompactKeys( 486 | _In_ ULONG Count, 487 | _In_reads_(Count) HANDLE KeyArray[] 488 | ); 489 | 490 | NTSYSCALLAPI 491 | NTSTATUS 492 | NTAPI 493 | NtCompressKey( 494 | _In_ HANDLE Key 495 | ); 496 | 497 | NTSYSCALLAPI 498 | NTSTATUS 499 | NTAPI 500 | NtLoadKey( 501 | _In_ POBJECT_ATTRIBUTES TargetKey, 502 | _In_ POBJECT_ATTRIBUTES SourceFile 503 | ); 504 | 505 | NTSYSCALLAPI 506 | NTSTATUS 507 | NTAPI 508 | NtLoadKey2( 509 | _In_ POBJECT_ATTRIBUTES TargetKey, 510 | _In_ POBJECT_ATTRIBUTES SourceFile, 511 | _In_ ULONG Flags 512 | ); 513 | 514 | NTSYSCALLAPI 515 | NTSTATUS 516 | NTAPI 517 | NtLoadKeyEx( 518 | _In_ POBJECT_ATTRIBUTES TargetKey, 519 | _In_ POBJECT_ATTRIBUTES SourceFile, 520 | _In_ ULONG Flags, 521 | _In_opt_ HANDLE TrustClassKey, // this and below were added on Win10 522 | _In_opt_ HANDLE Event, 523 | _In_opt_ ACCESS_MASK DesiredAccess, 524 | _Out_opt_ PHANDLE RootHandle, 525 | _Reserved_ PVOID Reserved // previously PIO_STATUS_BLOCK 526 | ); 527 | 528 | // rev by tyranid 529 | #if (PHNT_VERSION >= PHNT_20H1) 530 | NTSYSCALLAPI 531 | NTSTATUS 532 | NTAPI 533 | NtLoadKey3( 534 | _In_ POBJECT_ATTRIBUTES TargetKey, 535 | _In_ POBJECT_ATTRIBUTES SourceFile, 536 | _In_ ULONG Flags, 537 | _In_reads_(LoadEntryCount) PKEY_LOAD_ENTRY LoadEntries, 538 | _In_ ULONG LoadEntryCount, 539 | _In_opt_ ACCESS_MASK DesiredAccess, 540 | _Out_opt_ PHANDLE RootHandle, 541 | _Reserved_ PVOID Reserved 542 | ); 543 | #endif 544 | 545 | NTSYSCALLAPI 546 | NTSTATUS 547 | NTAPI 548 | NtReplaceKey( 549 | _In_ POBJECT_ATTRIBUTES NewFile, 550 | _In_ HANDLE TargetHandle, 551 | _In_ POBJECT_ATTRIBUTES OldFile 552 | ); 553 | 554 | NTSYSCALLAPI 555 | NTSTATUS 556 | NTAPI 557 | NtSaveKey( 558 | _In_ HANDLE KeyHandle, 559 | _In_ HANDLE FileHandle 560 | ); 561 | 562 | NTSYSCALLAPI 563 | NTSTATUS 564 | NTAPI 565 | NtSaveKeyEx( 566 | _In_ HANDLE KeyHandle, 567 | _In_ HANDLE FileHandle, 568 | _In_ ULONG Format 569 | ); 570 | 571 | NTSYSCALLAPI 572 | NTSTATUS 573 | NTAPI 574 | NtSaveMergedKeys( 575 | _In_ HANDLE HighPrecedenceKeyHandle, 576 | _In_ HANDLE LowPrecedenceKeyHandle, 577 | _In_ HANDLE FileHandle 578 | ); 579 | 580 | NTSYSCALLAPI 581 | NTSTATUS 582 | NTAPI 583 | NtRestoreKey( 584 | _In_ HANDLE KeyHandle, 585 | _In_ HANDLE FileHandle, 586 | _In_ ULONG Flags 587 | ); 588 | 589 | NTSYSCALLAPI 590 | NTSTATUS 591 | NTAPI 592 | NtUnloadKey( 593 | _In_ POBJECT_ATTRIBUTES TargetKey 594 | ); 595 | 596 | // 597 | // NtUnloadKey2 Flags (from winnt.h) 598 | // 599 | //#define REG_FORCE_UNLOAD 1 600 | //#define REG_UNLOAD_LEGAL_FLAGS (REG_FORCE_UNLOAD) 601 | 602 | NTSYSCALLAPI 603 | NTSTATUS 604 | NTAPI 605 | NtUnloadKey2( 606 | _In_ POBJECT_ATTRIBUTES TargetKey, 607 | _In_ ULONG Flags 608 | ); 609 | 610 | NTSYSCALLAPI 611 | NTSTATUS 612 | NTAPI 613 | NtUnloadKeyEx( 614 | _In_ POBJECT_ATTRIBUTES TargetKey, 615 | _In_opt_ HANDLE Event 616 | ); 617 | 618 | NTSYSCALLAPI 619 | NTSTATUS 620 | NTAPI 621 | NtNotifyChangeKey( 622 | _In_ HANDLE KeyHandle, 623 | _In_opt_ HANDLE Event, 624 | _In_opt_ PIO_APC_ROUTINE ApcRoutine, 625 | _In_opt_ PVOID ApcContext, 626 | _Out_ PIO_STATUS_BLOCK IoStatusBlock, 627 | _In_ ULONG CompletionFilter, 628 | _In_ BOOLEAN WatchTree, 629 | _Out_writes_bytes_opt_(BufferSize) PVOID Buffer, 630 | _In_ ULONG BufferSize, 631 | _In_ BOOLEAN Asynchronous 632 | ); 633 | 634 | NTSYSCALLAPI 635 | NTSTATUS 636 | NTAPI 637 | NtNotifyChangeMultipleKeys( 638 | _In_ HANDLE MasterKeyHandle, 639 | _In_opt_ ULONG Count, 640 | _In_reads_opt_(Count) OBJECT_ATTRIBUTES SubordinateObjects[], 641 | _In_opt_ HANDLE Event, 642 | _In_opt_ PIO_APC_ROUTINE ApcRoutine, 643 | _In_opt_ PVOID ApcContext, 644 | _Out_ PIO_STATUS_BLOCK IoStatusBlock, 645 | _In_ ULONG CompletionFilter, 646 | _In_ BOOLEAN WatchTree, 647 | _Out_writes_bytes_opt_(BufferSize) PVOID Buffer, 648 | _In_ ULONG BufferSize, 649 | _In_ BOOLEAN Asynchronous 650 | ); 651 | 652 | NTSYSCALLAPI 653 | NTSTATUS 654 | NTAPI 655 | NtQueryOpenSubKeys( 656 | _In_ POBJECT_ATTRIBUTES TargetKey, 657 | _Out_ PULONG HandleCount 658 | ); 659 | 660 | NTSYSCALLAPI 661 | NTSTATUS 662 | NTAPI 663 | NtQueryOpenSubKeysEx( 664 | _In_ POBJECT_ATTRIBUTES TargetKey, 665 | _In_ ULONG BufferLength, 666 | _Out_writes_bytes_opt_(BufferLength) PVOID Buffer, 667 | _Out_ PULONG RequiredSize 668 | ); 669 | 670 | NTSYSCALLAPI 671 | NTSTATUS 672 | NTAPI 673 | NtInitializeRegistry( 674 | _In_ USHORT BootCondition 675 | ); 676 | 677 | NTSYSCALLAPI 678 | NTSTATUS 679 | NTAPI 680 | NtLockRegistryKey( 681 | _In_ HANDLE KeyHandle 682 | ); 683 | 684 | NTSYSCALLAPI 685 | NTSTATUS 686 | NTAPI 687 | NtLockProductActivationKeys( 688 | _Inout_opt_ ULONG *pPrivateVer, 689 | _Out_opt_ ULONG *pSafeMode 690 | ); 691 | 692 | #if (PHNT_VERSION >= PHNT_VISTA) 693 | // private 694 | NTSYSCALLAPI 695 | NTSTATUS 696 | NTAPI 697 | NtFreezeRegistry( 698 | _In_ ULONG TimeOutInSeconds 699 | ); 700 | #endif 701 | 702 | #if (PHNT_VERSION >= PHNT_VISTA) 703 | // private 704 | NTSYSCALLAPI 705 | NTSTATUS 706 | NTAPI 707 | NtThawRegistry( 708 | VOID 709 | ); 710 | #endif 711 | 712 | #if (PHNT_VERSION >= PHNT_REDSTONE) 713 | NTSTATUS NtCreateRegistryTransaction( 714 | _Out_ HANDLE *RegistryTransactionHandle, 715 | _In_ ACCESS_MASK DesiredAccess, 716 | _In_opt_ POBJECT_ATTRIBUTES ObjAttributes, 717 | _Reserved_ ULONG CreateOptions 718 | ); 719 | #endif 720 | 721 | #if (PHNT_VERSION >= PHNT_REDSTONE) 722 | NTSTATUS NtOpenRegistryTransaction( 723 | _Out_ HANDLE *RegistryTransactionHandle, 724 | _In_ ACCESS_MASK DesiredAccess, 725 | _In_ POBJECT_ATTRIBUTES ObjAttributes 726 | ); 727 | #endif 728 | 729 | #if (PHNT_VERSION >= PHNT_REDSTONE) 730 | NTSTATUS NtCommitRegistryTransaction( 731 | _In_ HANDLE RegistryTransactionHandle, 732 | _Reserved_ ULONG Flags 733 | ); 734 | #endif 735 | 736 | #if (PHNT_VERSION >= PHNT_REDSTONE) 737 | NTSTATUS NtRollbackRegistryTransaction( 738 | _In_ HANDLE RegistryTransactionHandle, 739 | _Reserved_ ULONG Flags 740 | ); 741 | #endif 742 | 743 | #endif 744 | -------------------------------------------------------------------------------- /pnth/ntsmss.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTSMSS_H 13 | #define _NTSMSS_H 14 | 15 | NTSYSAPI 16 | NTSTATUS 17 | NTAPI 18 | RtlConnectToSm( 19 | _In_ PUNICODE_STRING ApiPortName, 20 | _In_ HANDLE ApiPortHandle, 21 | _In_ DWORD ProcessImageType, 22 | _Out_ PHANDLE SmssConnection 23 | ); 24 | 25 | NTSYSAPI 26 | NTSTATUS 27 | NTAPI 28 | RtlSendMsgToSm( 29 | _In_ HANDLE ApiPortHandle, 30 | _In_ PPORT_MESSAGE MessageData 31 | ); 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /pnth/nttmapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTTMAPI_H 13 | #define _NTTMAPI_H 14 | 15 | #if (PHNT_VERSION >= PHNT_VISTA) 16 | NTSYSCALLAPI 17 | NTSTATUS 18 | NTAPI 19 | NtCreateTransactionManager( 20 | _Out_ PHANDLE TmHandle, 21 | _In_ ACCESS_MASK DesiredAccess, 22 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 23 | _In_opt_ PUNICODE_STRING LogFileName, 24 | _In_opt_ ULONG CreateOptions, 25 | _In_opt_ ULONG CommitStrength 26 | ); 27 | #endif 28 | 29 | #if (PHNT_VERSION >= PHNT_VISTA) 30 | NTSYSCALLAPI 31 | NTSTATUS 32 | NTAPI 33 | NtOpenTransactionManager( 34 | _Out_ PHANDLE TmHandle, 35 | _In_ ACCESS_MASK DesiredAccess, 36 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 37 | _In_opt_ PUNICODE_STRING LogFileName, 38 | _In_opt_ LPGUID TmIdentity, 39 | _In_opt_ ULONG OpenOptions 40 | ); 41 | #endif 42 | 43 | #if (PHNT_VERSION >= PHNT_VISTA) 44 | NTSYSCALLAPI 45 | NTSTATUS 46 | NTAPI 47 | NtRenameTransactionManager( 48 | _In_ PUNICODE_STRING LogFileName, 49 | _In_ LPGUID ExistingTransactionManagerGuid 50 | ); 51 | #endif 52 | 53 | #if (PHNT_VERSION >= PHNT_VISTA) 54 | NTSYSCALLAPI 55 | NTSTATUS 56 | NTAPI 57 | NtRollforwardTransactionManager( 58 | _In_ HANDLE TransactionManagerHandle, 59 | _In_opt_ PLARGE_INTEGER TmVirtualClock 60 | ); 61 | #endif 62 | 63 | #if (PHNT_VERSION >= PHNT_VISTA) 64 | NTSYSCALLAPI 65 | NTSTATUS 66 | NTAPI 67 | NtRecoverTransactionManager( 68 | _In_ HANDLE TransactionManagerHandle 69 | ); 70 | #endif 71 | 72 | #if (PHNT_VERSION >= PHNT_VISTA) 73 | NTSYSCALLAPI 74 | NTSTATUS 75 | NTAPI 76 | NtQueryInformationTransactionManager( 77 | _In_ HANDLE TransactionManagerHandle, 78 | _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, 79 | _Out_writes_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, 80 | _In_ ULONG TransactionManagerInformationLength, 81 | _Out_opt_ PULONG ReturnLength 82 | ); 83 | #endif 84 | 85 | #if (PHNT_VERSION >= PHNT_VISTA) 86 | NTSYSCALLAPI 87 | NTSTATUS 88 | NTAPI 89 | NtSetInformationTransactionManager( 90 | _In_opt_ HANDLE TmHandle, 91 | _In_ TRANSACTIONMANAGER_INFORMATION_CLASS TransactionManagerInformationClass, 92 | _In_reads_bytes_(TransactionManagerInformationLength) PVOID TransactionManagerInformation, 93 | _In_ ULONG TransactionManagerInformationLength 94 | ); 95 | #endif 96 | 97 | #if (PHNT_VERSION >= PHNT_VISTA) 98 | NTSYSCALLAPI 99 | NTSTATUS 100 | NTAPI 101 | NtEnumerateTransactionObject( 102 | _In_opt_ HANDLE RootObjectHandle, 103 | _In_ KTMOBJECT_TYPE QueryType, 104 | _Inout_updates_bytes_(ObjectCursorLength) PKTMOBJECT_CURSOR ObjectCursor, 105 | _In_ ULONG ObjectCursorLength, 106 | _Out_ PULONG ReturnLength 107 | ); 108 | #endif 109 | 110 | #if (PHNT_VERSION >= PHNT_VISTA) 111 | NTSYSCALLAPI 112 | NTSTATUS 113 | NTAPI 114 | NtCreateTransaction( 115 | _Out_ PHANDLE TransactionHandle, 116 | _In_ ACCESS_MASK DesiredAccess, 117 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 118 | _In_opt_ LPGUID Uow, 119 | _In_opt_ HANDLE TmHandle, 120 | _In_opt_ ULONG CreateOptions, 121 | _In_opt_ ULONG IsolationLevel, 122 | _In_opt_ ULONG IsolationFlags, 123 | _In_opt_ PLARGE_INTEGER Timeout, 124 | _In_opt_ PUNICODE_STRING Description 125 | ); 126 | #endif 127 | 128 | #if (PHNT_VERSION >= PHNT_VISTA) 129 | NTSYSCALLAPI 130 | NTSTATUS 131 | NTAPI 132 | NtOpenTransaction( 133 | _Out_ PHANDLE TransactionHandle, 134 | _In_ ACCESS_MASK DesiredAccess, 135 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 136 | _In_opt_ LPGUID Uow, 137 | _In_opt_ HANDLE TmHandle 138 | ); 139 | #endif 140 | 141 | #if (PHNT_VERSION >= PHNT_VISTA) 142 | NTSYSCALLAPI 143 | NTSTATUS 144 | NTAPI 145 | NtQueryInformationTransaction( 146 | _In_ HANDLE TransactionHandle, 147 | _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, 148 | _Out_writes_bytes_(TransactionInformationLength) PVOID TransactionInformation, 149 | _In_ ULONG TransactionInformationLength, 150 | _Out_opt_ PULONG ReturnLength 151 | ); 152 | #endif 153 | 154 | #if (PHNT_VERSION >= PHNT_VISTA) 155 | NTSYSCALLAPI 156 | NTSTATUS 157 | NTAPI 158 | NtSetInformationTransaction( 159 | _In_ HANDLE TransactionHandle, 160 | _In_ TRANSACTION_INFORMATION_CLASS TransactionInformationClass, 161 | _In_reads_bytes_(TransactionInformationLength) PVOID TransactionInformation, 162 | _In_ ULONG TransactionInformationLength 163 | ); 164 | #endif 165 | 166 | #if (PHNT_VERSION >= PHNT_VISTA) 167 | NTSYSCALLAPI 168 | NTSTATUS 169 | NTAPI 170 | NtCommitTransaction( 171 | _In_ HANDLE TransactionHandle, 172 | _In_ BOOLEAN Wait 173 | ); 174 | #endif 175 | 176 | #if (PHNT_VERSION >= PHNT_VISTA) 177 | NTSYSCALLAPI 178 | NTSTATUS 179 | NTAPI 180 | NtRollbackTransaction( 181 | _In_ HANDLE TransactionHandle, 182 | _In_ BOOLEAN Wait 183 | ); 184 | #endif 185 | 186 | #if (PHNT_VERSION >= PHNT_VISTA) 187 | NTSYSCALLAPI 188 | NTSTATUS 189 | NTAPI 190 | NtCreateEnlistment( 191 | _Out_ PHANDLE EnlistmentHandle, 192 | _In_ ACCESS_MASK DesiredAccess, 193 | _In_ HANDLE ResourceManagerHandle, 194 | _In_ HANDLE TransactionHandle, 195 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 196 | _In_opt_ ULONG CreateOptions, 197 | _In_ NOTIFICATION_MASK NotificationMask, 198 | _In_opt_ PVOID EnlistmentKey 199 | ); 200 | #endif 201 | 202 | #if (PHNT_VERSION >= PHNT_VISTA) 203 | NTSYSCALLAPI 204 | NTSTATUS 205 | NTAPI 206 | NtOpenEnlistment( 207 | _Out_ PHANDLE EnlistmentHandle, 208 | _In_ ACCESS_MASK DesiredAccess, 209 | _In_ HANDLE ResourceManagerHandle, 210 | _In_ LPGUID EnlistmentGuid, 211 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes 212 | ); 213 | #endif 214 | 215 | #if (PHNT_VERSION >= PHNT_VISTA) 216 | NTSYSCALLAPI 217 | NTSTATUS 218 | NTAPI 219 | NtQueryInformationEnlistment( 220 | _In_ HANDLE EnlistmentHandle, 221 | _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, 222 | _Out_writes_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, 223 | _In_ ULONG EnlistmentInformationLength, 224 | _Out_opt_ PULONG ReturnLength 225 | ); 226 | #endif 227 | 228 | #if (PHNT_VERSION >= PHNT_VISTA) 229 | NTSYSCALLAPI 230 | NTSTATUS 231 | NTAPI 232 | NtSetInformationEnlistment( 233 | _In_opt_ HANDLE EnlistmentHandle, 234 | _In_ ENLISTMENT_INFORMATION_CLASS EnlistmentInformationClass, 235 | _In_reads_bytes_(EnlistmentInformationLength) PVOID EnlistmentInformation, 236 | _In_ ULONG EnlistmentInformationLength 237 | ); 238 | #endif 239 | 240 | #if (PHNT_VERSION >= PHNT_VISTA) 241 | NTSYSCALLAPI 242 | NTSTATUS 243 | NTAPI 244 | NtRecoverEnlistment( 245 | _In_ HANDLE EnlistmentHandle, 246 | _In_opt_ PVOID EnlistmentKey 247 | ); 248 | #endif 249 | 250 | #if (PHNT_VERSION >= PHNT_VISTA) 251 | NTSYSCALLAPI 252 | NTSTATUS 253 | NTAPI 254 | NtPrePrepareEnlistment( 255 | _In_ HANDLE EnlistmentHandle, 256 | _In_opt_ PLARGE_INTEGER TmVirtualClock 257 | ); 258 | #endif 259 | 260 | #if (PHNT_VERSION >= PHNT_VISTA) 261 | NTSYSCALLAPI 262 | NTSTATUS 263 | NTAPI 264 | NtPrepareEnlistment( 265 | _In_ HANDLE EnlistmentHandle, 266 | _In_opt_ PLARGE_INTEGER TmVirtualClock 267 | ); 268 | #endif 269 | 270 | #if (PHNT_VERSION >= PHNT_VISTA) 271 | NTSYSCALLAPI 272 | NTSTATUS 273 | NTAPI 274 | NtCommitEnlistment( 275 | _In_ HANDLE EnlistmentHandle, 276 | _In_opt_ PLARGE_INTEGER TmVirtualClock 277 | ); 278 | #endif 279 | 280 | #if (PHNT_VERSION >= PHNT_VISTA) 281 | NTSYSCALLAPI 282 | NTSTATUS 283 | NTAPI 284 | NtRollbackEnlistment( 285 | _In_ HANDLE EnlistmentHandle, 286 | _In_opt_ PLARGE_INTEGER TmVirtualClock 287 | ); 288 | #endif 289 | 290 | #if (PHNT_VERSION >= PHNT_VISTA) 291 | NTSYSCALLAPI 292 | NTSTATUS 293 | NTAPI 294 | NtPrePrepareComplete( 295 | _In_ HANDLE EnlistmentHandle, 296 | _In_opt_ PLARGE_INTEGER TmVirtualClock 297 | ); 298 | #endif 299 | 300 | #if (PHNT_VERSION >= PHNT_VISTA) 301 | NTSYSCALLAPI 302 | NTSTATUS 303 | NTAPI 304 | NtPrepareComplete( 305 | _In_ HANDLE EnlistmentHandle, 306 | _In_opt_ PLARGE_INTEGER TmVirtualClock 307 | ); 308 | #endif 309 | 310 | #if (PHNT_VERSION >= PHNT_VISTA) 311 | NTSYSCALLAPI 312 | NTSTATUS 313 | NTAPI 314 | NtCommitComplete( 315 | _In_ HANDLE EnlistmentHandle, 316 | _In_opt_ PLARGE_INTEGER TmVirtualClock 317 | ); 318 | #endif 319 | 320 | #if (PHNT_VERSION >= PHNT_VISTA) 321 | NTSYSCALLAPI 322 | NTSTATUS 323 | NTAPI 324 | NtReadOnlyEnlistment( 325 | _In_ HANDLE EnlistmentHandle, 326 | _In_opt_ PLARGE_INTEGER TmVirtualClock 327 | ); 328 | #endif 329 | 330 | #if (PHNT_VERSION >= PHNT_VISTA) 331 | NTSYSCALLAPI 332 | NTSTATUS 333 | NTAPI 334 | NtRollbackComplete( 335 | _In_ HANDLE EnlistmentHandle, 336 | _In_opt_ PLARGE_INTEGER TmVirtualClock 337 | ); 338 | #endif 339 | 340 | #if (PHNT_VERSION >= PHNT_VISTA) 341 | NTSYSCALLAPI 342 | NTSTATUS 343 | NTAPI 344 | NtSinglePhaseReject( 345 | _In_ HANDLE EnlistmentHandle, 346 | _In_opt_ PLARGE_INTEGER TmVirtualClock 347 | ); 348 | #endif 349 | 350 | #if (PHNT_VERSION >= PHNT_VISTA) 351 | NTSYSCALLAPI 352 | NTSTATUS 353 | NTAPI 354 | NtCreateResourceManager( 355 | _Out_ PHANDLE ResourceManagerHandle, 356 | _In_ ACCESS_MASK DesiredAccess, 357 | _In_ HANDLE TmHandle, 358 | _In_ LPGUID RmGuid, 359 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes, 360 | _In_opt_ ULONG CreateOptions, 361 | _In_opt_ PUNICODE_STRING Description 362 | ); 363 | #endif 364 | 365 | #if (PHNT_VERSION >= PHNT_VISTA) 366 | NTSYSCALLAPI 367 | NTSTATUS 368 | NTAPI 369 | NtOpenResourceManager( 370 | _Out_ PHANDLE ResourceManagerHandle, 371 | _In_ ACCESS_MASK DesiredAccess, 372 | _In_ HANDLE TmHandle, 373 | _In_opt_ LPGUID ResourceManagerGuid, 374 | _In_opt_ POBJECT_ATTRIBUTES ObjectAttributes 375 | ); 376 | #endif 377 | 378 | #if (PHNT_VERSION >= PHNT_VISTA) 379 | NTSYSCALLAPI 380 | NTSTATUS 381 | NTAPI 382 | NtRecoverResourceManager( 383 | _In_ HANDLE ResourceManagerHandle 384 | ); 385 | #endif 386 | 387 | #if (PHNT_VERSION >= PHNT_VISTA) 388 | NTSYSCALLAPI 389 | NTSTATUS 390 | NTAPI 391 | NtGetNotificationResourceManager( 392 | _In_ HANDLE ResourceManagerHandle, 393 | _Out_ PTRANSACTION_NOTIFICATION TransactionNotification, 394 | _In_ ULONG NotificationLength, 395 | _In_opt_ PLARGE_INTEGER Timeout, 396 | _Out_opt_ PULONG ReturnLength, 397 | _In_ ULONG Asynchronous, 398 | _In_opt_ ULONG_PTR AsynchronousContext 399 | ); 400 | #endif 401 | 402 | #if (PHNT_VERSION >= PHNT_VISTA) 403 | NTSYSCALLAPI 404 | NTSTATUS 405 | NTAPI 406 | NtQueryInformationResourceManager( 407 | _In_ HANDLE ResourceManagerHandle, 408 | _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, 409 | _Out_writes_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, 410 | _In_ ULONG ResourceManagerInformationLength, 411 | _Out_opt_ PULONG ReturnLength 412 | ); 413 | #endif 414 | 415 | #if (PHNT_VERSION >= PHNT_VISTA) 416 | NTSYSCALLAPI 417 | NTSTATUS 418 | NTAPI 419 | NtSetInformationResourceManager( 420 | _In_ HANDLE ResourceManagerHandle, 421 | _In_ RESOURCEMANAGER_INFORMATION_CLASS ResourceManagerInformationClass, 422 | _In_reads_bytes_(ResourceManagerInformationLength) PVOID ResourceManagerInformation, 423 | _In_ ULONG ResourceManagerInformationLength 424 | ); 425 | #endif 426 | 427 | #if (PHNT_VERSION >= PHNT_VISTA) 428 | NTSYSCALLAPI 429 | NTSTATUS 430 | NTAPI 431 | NtRegisterProtocolAddressInformation( 432 | _In_ HANDLE ResourceManager, 433 | _In_ PCRM_PROTOCOL_ID ProtocolId, 434 | _In_ ULONG ProtocolInformationSize, 435 | _In_ PVOID ProtocolInformation, 436 | _In_opt_ ULONG CreateOptions 437 | ); 438 | #endif 439 | 440 | #if (PHNT_VERSION >= PHNT_VISTA) 441 | NTSYSCALLAPI 442 | NTSTATUS 443 | NTAPI 444 | NtPropagationComplete( 445 | _In_ HANDLE ResourceManagerHandle, 446 | _In_ ULONG RequestCookie, 447 | _In_ ULONG BufferLength, 448 | _In_ PVOID Buffer 449 | ); 450 | #endif 451 | 452 | #if (PHNT_VERSION >= PHNT_VISTA) 453 | NTSYSCALLAPI 454 | NTSTATUS 455 | NTAPI 456 | NtPropagationFailed( 457 | _In_ HANDLE ResourceManagerHandle, 458 | _In_ ULONG RequestCookie, 459 | _In_ NTSTATUS PropStatus 460 | ); 461 | #endif 462 | 463 | #if (PHNT_VERSION >= PHNT_VISTA) 464 | // private 465 | NTSYSCALLAPI 466 | NTSTATUS 467 | NTAPI 468 | NtFreezeTransactions( 469 | _In_ PLARGE_INTEGER FreezeTimeout, 470 | _In_ PLARGE_INTEGER ThawTimeout 471 | ); 472 | #endif 473 | 474 | #if (PHNT_VERSION >= PHNT_VISTA) 475 | // private 476 | NTSYSCALLAPI 477 | NTSTATUS 478 | NTAPI 479 | NtThawTransactions( 480 | VOID 481 | ); 482 | #endif 483 | 484 | #endif 485 | -------------------------------------------------------------------------------- /pnth/nttp.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTTP_H 13 | #define _NTTP_H 14 | 15 | // Some types are already defined in winnt.h. 16 | 17 | typedef struct _TP_ALPC TP_ALPC, *PTP_ALPC; 18 | 19 | // private 20 | typedef VOID (NTAPI *PTP_ALPC_CALLBACK)( 21 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 22 | _Inout_opt_ PVOID Context, 23 | _In_ PTP_ALPC Alpc 24 | ); 25 | 26 | // rev 27 | typedef VOID (NTAPI *PTP_ALPC_CALLBACK_EX)( 28 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 29 | _Inout_opt_ PVOID Context, 30 | _In_ PTP_ALPC Alpc, 31 | _In_ PVOID ApcContext 32 | ); 33 | 34 | #if (PHNT_VERSION >= PHNT_VISTA) 35 | 36 | // private 37 | _Check_return_ 38 | NTSYSAPI 39 | NTSTATUS 40 | NTAPI 41 | TpAllocPool( 42 | _Out_ PTP_POOL *PoolReturn, 43 | _Reserved_ PVOID Reserved 44 | ); 45 | 46 | // winbase:CloseThreadpool 47 | NTSYSAPI 48 | VOID 49 | NTAPI 50 | TpReleasePool( 51 | _Inout_ PTP_POOL Pool 52 | ); 53 | 54 | // winbase:SetThreadpoolThreadMaximum 55 | NTSYSAPI 56 | VOID 57 | NTAPI 58 | TpSetPoolMaxThreads( 59 | _Inout_ PTP_POOL Pool, 60 | _In_ ULONG MaxThreads 61 | ); 62 | 63 | // private 64 | NTSYSAPI 65 | NTSTATUS 66 | NTAPI 67 | TpSetPoolMinThreads( 68 | _Inout_ PTP_POOL Pool, 69 | _In_ ULONG MinThreads 70 | ); 71 | 72 | #if (PHNT_VERSION >= PHNT_WIN7) 73 | // rev 74 | NTSYSAPI 75 | NTSTATUS 76 | NTAPI 77 | TpQueryPoolStackInformation( 78 | _In_ PTP_POOL Pool, 79 | _Out_ PTP_POOL_STACK_INFORMATION PoolStackInformation 80 | ); 81 | #endif 82 | 83 | #if (PHNT_VERSION >= PHNT_WIN7) 84 | // rev 85 | NTSYSAPI 86 | NTSTATUS 87 | NTAPI 88 | TpSetPoolStackInformation( 89 | _Inout_ PTP_POOL Pool, 90 | _In_ PTP_POOL_STACK_INFORMATION PoolStackInformation 91 | ); 92 | #endif 93 | 94 | // private 95 | _Check_return_ 96 | NTSYSAPI 97 | NTSTATUS 98 | NTAPI 99 | TpAllocCleanupGroup( 100 | _Out_ PTP_CLEANUP_GROUP *CleanupGroupReturn 101 | ); 102 | 103 | // winbase:CloseThreadpoolCleanupGroup 104 | NTSYSAPI 105 | VOID 106 | NTAPI 107 | TpReleaseCleanupGroup( 108 | _Inout_ PTP_CLEANUP_GROUP CleanupGroup 109 | ); 110 | 111 | // winbase:CloseThreadpoolCleanupGroupMembers 112 | NTSYSAPI 113 | VOID 114 | NTAPI 115 | TpReleaseCleanupGroupMembers( 116 | _Inout_ PTP_CLEANUP_GROUP CleanupGroup, 117 | _In_ LOGICAL CancelPendingCallbacks, 118 | _Inout_opt_ PVOID CleanupParameter 119 | ); 120 | 121 | // winbase:SetEventWhenCallbackReturns 122 | NTSYSAPI 123 | VOID 124 | NTAPI 125 | TpCallbackSetEventOnCompletion( 126 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 127 | _In_ HANDLE Event 128 | ); 129 | 130 | // winbase:ReleaseSemaphoreWhenCallbackReturns 131 | NTSYSAPI 132 | VOID 133 | NTAPI 134 | TpCallbackReleaseSemaphoreOnCompletion( 135 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 136 | _In_ HANDLE Semaphore, 137 | _In_ ULONG ReleaseCount 138 | ); 139 | 140 | // winbase:ReleaseMutexWhenCallbackReturns 141 | NTSYSAPI 142 | VOID 143 | NTAPI 144 | TpCallbackReleaseMutexOnCompletion( 145 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 146 | _In_ HANDLE Mutex 147 | ); 148 | 149 | // winbase:LeaveCriticalSectionWhenCallbackReturns 150 | NTSYSAPI 151 | VOID 152 | NTAPI 153 | TpCallbackLeaveCriticalSectionOnCompletion( 154 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 155 | _Inout_ PRTL_CRITICAL_SECTION CriticalSection 156 | ); 157 | 158 | // winbase:FreeLibraryWhenCallbackReturns 159 | NTSYSAPI 160 | VOID 161 | NTAPI 162 | TpCallbackUnloadDllOnCompletion( 163 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 164 | _In_ PVOID DllHandle 165 | ); 166 | 167 | // winbase:CallbackMayRunLong 168 | NTSYSAPI 169 | NTSTATUS 170 | NTAPI 171 | TpCallbackMayRunLong( 172 | _Inout_ PTP_CALLBACK_INSTANCE Instance 173 | ); 174 | 175 | // winbase:DisassociateCurrentThreadFromCallback 176 | NTSYSAPI 177 | VOID 178 | NTAPI 179 | TpDisassociateCallback( 180 | _Inout_ PTP_CALLBACK_INSTANCE Instance 181 | ); 182 | 183 | // winbase:TrySubmitThreadpoolCallback 184 | _Check_return_ 185 | NTSYSAPI 186 | NTSTATUS 187 | NTAPI 188 | TpSimpleTryPost( 189 | _In_ PTP_SIMPLE_CALLBACK Callback, 190 | _Inout_opt_ PVOID Context, 191 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 192 | ); 193 | 194 | // private 195 | _Check_return_ 196 | NTSYSAPI 197 | NTSTATUS 198 | NTAPI 199 | TpAllocWork( 200 | _Out_ PTP_WORK *WorkReturn, 201 | _In_ PTP_WORK_CALLBACK Callback, 202 | _Inout_opt_ PVOID Context, 203 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 204 | ); 205 | 206 | // winbase:CloseThreadpoolWork 207 | NTSYSAPI 208 | VOID 209 | NTAPI 210 | TpReleaseWork( 211 | _Inout_ PTP_WORK Work 212 | ); 213 | 214 | // winbase:SubmitThreadpoolWork 215 | NTSYSAPI 216 | VOID 217 | NTAPI 218 | TpPostWork( 219 | _Inout_ PTP_WORK Work 220 | ); 221 | 222 | // winbase:WaitForThreadpoolWorkCallbacks 223 | NTSYSAPI 224 | VOID 225 | NTAPI 226 | TpWaitForWork( 227 | _Inout_ PTP_WORK Work, 228 | _In_ LOGICAL CancelPendingCallbacks 229 | ); 230 | 231 | // private 232 | _Check_return_ 233 | NTSYSAPI 234 | NTSTATUS 235 | NTAPI 236 | TpAllocTimer( 237 | _Out_ PTP_TIMER *Timer, 238 | _In_ PTP_TIMER_CALLBACK Callback, 239 | _Inout_opt_ PVOID Context, 240 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 241 | ); 242 | 243 | // winbase:CloseThreadpoolTimer 244 | NTSYSAPI 245 | VOID 246 | NTAPI 247 | TpReleaseTimer( 248 | _Inout_ PTP_TIMER Timer 249 | ); 250 | 251 | // winbase:SetThreadpoolTimer 252 | NTSYSAPI 253 | VOID 254 | NTAPI 255 | TpSetTimer( 256 | _Inout_ PTP_TIMER Timer, 257 | _In_opt_ PLARGE_INTEGER DueTime, 258 | _In_ ULONG Period, 259 | _In_opt_ ULONG WindowLength 260 | ); 261 | 262 | #if (PHNT_VERSION >= PHNT_WIN8) 263 | // winbase:SetThreadpoolTimerEx 264 | NTSYSAPI 265 | NTSTATUS 266 | NTAPI 267 | TpSetTimerEx( 268 | _Inout_ PTP_TIMER Timer, 269 | _In_opt_ PLARGE_INTEGER DueTime, 270 | _In_ ULONG Period, 271 | _In_opt_ ULONG WindowLength 272 | ); 273 | #endif 274 | 275 | // winbase:IsThreadpoolTimerSet 276 | NTSYSAPI 277 | LOGICAL 278 | NTAPI 279 | TpIsTimerSet( 280 | _In_ PTP_TIMER Timer 281 | ); 282 | 283 | // winbase:WaitForThreadpoolTimerCallbacks 284 | NTSYSAPI 285 | VOID 286 | NTAPI 287 | TpWaitForTimer( 288 | _Inout_ PTP_TIMER Timer, 289 | _In_ LOGICAL CancelPendingCallbacks 290 | ); 291 | 292 | // private 293 | _Check_return_ 294 | NTSYSAPI 295 | NTSTATUS 296 | NTAPI 297 | TpAllocWait( 298 | _Out_ PTP_WAIT *WaitReturn, 299 | _In_ PTP_WAIT_CALLBACK Callback, 300 | _Inout_opt_ PVOID Context, 301 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 302 | ); 303 | 304 | // winbase:CloseThreadpoolWait 305 | NTSYSAPI 306 | VOID 307 | NTAPI 308 | TpReleaseWait( 309 | _Inout_ PTP_WAIT Wait 310 | ); 311 | 312 | // winbase:SetThreadpoolWait 313 | NTSYSAPI 314 | VOID 315 | NTAPI 316 | TpSetWait( 317 | _Inout_ PTP_WAIT Wait, 318 | _In_opt_ HANDLE Handle, 319 | _In_opt_ PLARGE_INTEGER Timeout 320 | ); 321 | 322 | #if (PHNT_VERSION >= PHNT_WIN8) 323 | // winbase:SetThreadpoolWaitEx 324 | NTSYSAPI 325 | NTSTATUS 326 | NTAPI 327 | TpSetWaitEx( 328 | _Inout_ PTP_WAIT Wait, 329 | _In_opt_ HANDLE Handle, 330 | _In_opt_ PLARGE_INTEGER Timeout, 331 | _In_opt_ PVOID Reserved 332 | ); 333 | #endif 334 | 335 | // winbase:WaitForThreadpoolWaitCallbacks 336 | NTSYSAPI 337 | VOID 338 | NTAPI 339 | TpWaitForWait( 340 | _Inout_ PTP_WAIT Wait, 341 | _In_ LOGICAL CancelPendingCallbacks 342 | ); 343 | 344 | // private 345 | typedef VOID (NTAPI *PTP_IO_CALLBACK)( 346 | _Inout_ PTP_CALLBACK_INSTANCE Instance, 347 | _Inout_opt_ PVOID Context, 348 | _In_ PVOID ApcContext, 349 | _In_ PIO_STATUS_BLOCK IoSB, 350 | _In_ PTP_IO Io 351 | ); 352 | 353 | // private 354 | _Check_return_ 355 | NTSYSAPI 356 | NTSTATUS 357 | NTAPI 358 | TpAllocIoCompletion( 359 | _Out_ PTP_IO *IoReturn, 360 | _In_ HANDLE File, 361 | _In_ PTP_IO_CALLBACK Callback, 362 | _Inout_opt_ PVOID Context, 363 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 364 | ); 365 | 366 | // winbase:CloseThreadpoolIo 367 | NTSYSAPI 368 | VOID 369 | NTAPI 370 | TpReleaseIoCompletion( 371 | _Inout_ PTP_IO Io 372 | ); 373 | 374 | // winbase:StartThreadpoolIo 375 | NTSYSAPI 376 | VOID 377 | NTAPI 378 | TpStartAsyncIoOperation( 379 | _Inout_ PTP_IO Io 380 | ); 381 | 382 | // winbase:CancelThreadpoolIo 383 | NTSYSAPI 384 | VOID 385 | NTAPI 386 | TpCancelAsyncIoOperation( 387 | _Inout_ PTP_IO Io 388 | ); 389 | 390 | // winbase:WaitForThreadpoolIoCallbacks 391 | NTSYSAPI 392 | VOID 393 | NTAPI 394 | TpWaitForIoCompletion( 395 | _Inout_ PTP_IO Io, 396 | _In_ LOGICAL CancelPendingCallbacks 397 | ); 398 | 399 | // private 400 | NTSYSAPI 401 | NTSTATUS 402 | NTAPI 403 | TpAllocAlpcCompletion( 404 | _Out_ PTP_ALPC *AlpcReturn, 405 | _In_ HANDLE AlpcPort, 406 | _In_ PTP_ALPC_CALLBACK Callback, 407 | _Inout_opt_ PVOID Context, 408 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 409 | ); 410 | 411 | #if (PHNT_VERSION >= PHNT_WIN7) 412 | // rev 413 | NTSYSAPI 414 | NTSTATUS 415 | NTAPI 416 | TpAllocAlpcCompletionEx( 417 | _Out_ PTP_ALPC *AlpcReturn, 418 | _In_ HANDLE AlpcPort, 419 | _In_ PTP_ALPC_CALLBACK_EX Callback, 420 | _Inout_opt_ PVOID Context, 421 | _In_opt_ PTP_CALLBACK_ENVIRON CallbackEnviron 422 | ); 423 | #endif 424 | 425 | // private 426 | NTSYSAPI 427 | VOID 428 | NTAPI 429 | TpReleaseAlpcCompletion( 430 | _Inout_ PTP_ALPC Alpc 431 | ); 432 | 433 | // private 434 | NTSYSAPI 435 | VOID 436 | NTAPI 437 | TpWaitForAlpcCompletion( 438 | _Inout_ PTP_ALPC Alpc 439 | ); 440 | 441 | // private 442 | typedef enum _TP_TRACE_TYPE 443 | { 444 | TpTraceThreadPriority = 1, 445 | TpTraceThreadAffinity, 446 | MaxTpTraceType 447 | } TP_TRACE_TYPE; 448 | 449 | // private 450 | NTSYSAPI 451 | VOID 452 | NTAPI 453 | TpCaptureCaller( 454 | _In_ TP_TRACE_TYPE Type 455 | ); 456 | 457 | // private 458 | NTSYSAPI 459 | VOID 460 | NTAPI 461 | TpCheckTerminateWorker( 462 | _In_ HANDLE Thread 463 | ); 464 | 465 | #endif 466 | 467 | #endif 468 | -------------------------------------------------------------------------------- /pnth/ntwow64.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTWOW64_H 13 | #define _NTWOW64_H 14 | 15 | #define WOW64_SYSTEM_DIRECTORY "SysWOW64" 16 | #define WOW64_SYSTEM_DIRECTORY_U L"SysWOW64" 17 | #define WOW64_X86_TAG " (x86)" 18 | #define WOW64_X86_TAG_U L" (x86)" 19 | 20 | // In USER_SHARED_DATA 21 | typedef enum _WOW64_SHARED_INFORMATION 22 | { 23 | SharedNtdll32LdrInitializeThunk, 24 | SharedNtdll32KiUserExceptionDispatcher, 25 | SharedNtdll32KiUserApcDispatcher, 26 | SharedNtdll32KiUserCallbackDispatcher, 27 | SharedNtdll32ExpInterlockedPopEntrySListFault, 28 | SharedNtdll32ExpInterlockedPopEntrySListResume, 29 | SharedNtdll32ExpInterlockedPopEntrySListEnd, 30 | SharedNtdll32RtlUserThreadStart, 31 | SharedNtdll32pQueryProcessDebugInformationRemote, 32 | SharedNtdll32BaseAddress, 33 | SharedNtdll32LdrSystemDllInitBlock, 34 | Wow64SharedPageEntriesCount 35 | } WOW64_SHARED_INFORMATION; 36 | 37 | // 32-bit definitions 38 | 39 | #define WOW64_POINTER(Type) ULONG 40 | 41 | typedef struct _RTL_BALANCED_NODE32 42 | { 43 | union 44 | { 45 | WOW64_POINTER(struct _RTL_BALANCED_NODE *) Children[2]; 46 | struct 47 | { 48 | WOW64_POINTER(struct _RTL_BALANCED_NODE *) Left; 49 | WOW64_POINTER(struct _RTL_BALANCED_NODE *) Right; 50 | }; 51 | }; 52 | union 53 | { 54 | WOW64_POINTER(UCHAR) Red : 1; 55 | WOW64_POINTER(UCHAR) Balance : 2; 56 | WOW64_POINTER(ULONG_PTR) ParentValue; 57 | }; 58 | } RTL_BALANCED_NODE32, *PRTL_BALANCED_NODE32; 59 | 60 | typedef struct _RTL_RB_TREE32 61 | { 62 | WOW64_POINTER(PRTL_BALANCED_NODE) Root; 63 | WOW64_POINTER(PRTL_BALANCED_NODE) Min; 64 | } RTL_RB_TREE32, *PRTL_RB_TREE32; 65 | 66 | typedef struct _PEB_LDR_DATA32 67 | { 68 | ULONG Length; 69 | BOOLEAN Initialized; 70 | WOW64_POINTER(HANDLE) SsHandle; 71 | LIST_ENTRY32 InLoadOrderModuleList; 72 | LIST_ENTRY32 InMemoryOrderModuleList; 73 | LIST_ENTRY32 InInitializationOrderModuleList; 74 | WOW64_POINTER(PVOID) EntryInProgress; 75 | BOOLEAN ShutdownInProgress; 76 | WOW64_POINTER(HANDLE) ShutdownThreadId; 77 | } PEB_LDR_DATA32, *PPEB_LDR_DATA32; 78 | 79 | typedef struct _LDR_SERVICE_TAG_RECORD32 80 | { 81 | WOW64_POINTER(struct _LDR_SERVICE_TAG_RECORD *) Next; 82 | ULONG ServiceTag; 83 | } LDR_SERVICE_TAG_RECORD32, *PLDR_SERVICE_TAG_RECORD32; 84 | 85 | typedef struct _LDRP_CSLIST32 86 | { 87 | WOW64_POINTER(PSINGLE_LIST_ENTRY) Tail; 88 | } LDRP_CSLIST32, *PLDRP_CSLIST32; 89 | 90 | typedef struct _LDR_DDAG_NODE32 91 | { 92 | LIST_ENTRY32 Modules; 93 | WOW64_POINTER(PLDR_SERVICE_TAG_RECORD) ServiceTagList; 94 | ULONG LoadCount; 95 | ULONG LoadWhileUnloadingCount; 96 | ULONG LowestLink; 97 | union 98 | { 99 | LDRP_CSLIST32 Dependencies; 100 | SINGLE_LIST_ENTRY32 RemovalLink; 101 | }; 102 | LDRP_CSLIST32 IncomingDependencies; 103 | LDR_DDAG_STATE State; 104 | SINGLE_LIST_ENTRY32 CondenseLink; 105 | ULONG PreorderNumber; 106 | } LDR_DDAG_NODE32, *PLDR_DDAG_NODE32; 107 | 108 | #define LDR_DATA_TABLE_ENTRY_SIZE_WINXP_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, DdagNode) 109 | #define LDR_DATA_TABLE_ENTRY_SIZE_WIN7_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, BaseNameHashValue) 110 | #define LDR_DATA_TABLE_ENTRY_SIZE_WIN8_32 FIELD_OFFSET(LDR_DATA_TABLE_ENTRY32, ImplicitPathOptions) 111 | 112 | typedef struct _LDR_DATA_TABLE_ENTRY32 113 | { 114 | LIST_ENTRY32 InLoadOrderLinks; 115 | LIST_ENTRY32 InMemoryOrderLinks; 116 | union 117 | { 118 | LIST_ENTRY32 InInitializationOrderLinks; 119 | LIST_ENTRY32 InProgressLinks; 120 | }; 121 | WOW64_POINTER(PVOID) DllBase; 122 | WOW64_POINTER(PVOID) EntryPoint; 123 | ULONG SizeOfImage; 124 | UNICODE_STRING32 FullDllName; 125 | UNICODE_STRING32 BaseDllName; 126 | union 127 | { 128 | UCHAR FlagGroup[4]; 129 | ULONG Flags; 130 | struct 131 | { 132 | ULONG PackagedBinary : 1; 133 | ULONG MarkedForRemoval : 1; 134 | ULONG ImageDll : 1; 135 | ULONG LoadNotificationsSent : 1; 136 | ULONG TelemetryEntryProcessed : 1; 137 | ULONG ProcessStaticImport : 1; 138 | ULONG InLegacyLists : 1; 139 | ULONG InIndexes : 1; 140 | ULONG ShimDll : 1; 141 | ULONG InExceptionTable : 1; 142 | ULONG ReservedFlags1 : 2; 143 | ULONG LoadInProgress : 1; 144 | ULONG LoadConfigProcessed : 1; 145 | ULONG EntryProcessed : 1; 146 | ULONG ProtectDelayLoad : 1; 147 | ULONG ReservedFlags3 : 2; 148 | ULONG DontCallForThreads : 1; 149 | ULONG ProcessAttachCalled : 1; 150 | ULONG ProcessAttachFailed : 1; 151 | ULONG CorDeferredValidate : 1; 152 | ULONG CorImage : 1; 153 | ULONG DontRelocate : 1; 154 | ULONG CorILOnly : 1; 155 | ULONG ChpeImage : 1; 156 | ULONG ReservedFlags5 : 2; 157 | ULONG Redirected : 1; 158 | ULONG ReservedFlags6 : 2; 159 | ULONG CompatDatabaseProcessed : 1; 160 | }; 161 | }; 162 | USHORT ObsoleteLoadCount; 163 | USHORT TlsIndex; 164 | LIST_ENTRY32 HashLinks; 165 | ULONG TimeDateStamp; 166 | WOW64_POINTER(struct _ACTIVATION_CONTEXT *) EntryPointActivationContext; 167 | WOW64_POINTER(PVOID) Lock; 168 | WOW64_POINTER(PLDR_DDAG_NODE) DdagNode; 169 | LIST_ENTRY32 NodeModuleLink; 170 | WOW64_POINTER(struct _LDRP_LOAD_CONTEXT *) LoadContext; 171 | WOW64_POINTER(PVOID) ParentDllBase; 172 | WOW64_POINTER(PVOID) SwitchBackContext; 173 | RTL_BALANCED_NODE32 BaseAddressIndexNode; 174 | RTL_BALANCED_NODE32 MappingInfoIndexNode; 175 | WOW64_POINTER(ULONG_PTR) OriginalBase; 176 | LARGE_INTEGER LoadTime; 177 | ULONG BaseNameHashValue; 178 | LDR_DLL_LOAD_REASON LoadReason; 179 | ULONG ImplicitPathOptions; 180 | ULONG ReferenceCount; 181 | ULONG DependentLoadFlags; 182 | UCHAR SigningLevel; // since REDSTONE2 183 | } LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32; 184 | 185 | typedef struct _CURDIR32 186 | { 187 | UNICODE_STRING32 DosPath; 188 | WOW64_POINTER(HANDLE) Handle; 189 | } CURDIR32, *PCURDIR32; 190 | 191 | typedef struct _RTL_DRIVE_LETTER_CURDIR32 192 | { 193 | USHORT Flags; 194 | USHORT Length; 195 | ULONG TimeStamp; 196 | STRING32 DosPath; 197 | } RTL_DRIVE_LETTER_CURDIR32, *PRTL_DRIVE_LETTER_CURDIR32; 198 | 199 | typedef struct _RTL_USER_PROCESS_PARAMETERS32 200 | { 201 | ULONG MaximumLength; 202 | ULONG Length; 203 | 204 | ULONG Flags; 205 | ULONG DebugFlags; 206 | 207 | WOW64_POINTER(HANDLE) ConsoleHandle; 208 | ULONG ConsoleFlags; 209 | WOW64_POINTER(HANDLE) StandardInput; 210 | WOW64_POINTER(HANDLE) StandardOutput; 211 | WOW64_POINTER(HANDLE) StandardError; 212 | 213 | CURDIR32 CurrentDirectory; 214 | UNICODE_STRING32 DllPath; 215 | UNICODE_STRING32 ImagePathName; 216 | UNICODE_STRING32 CommandLine; 217 | WOW64_POINTER(PVOID) Environment; 218 | 219 | ULONG StartingX; 220 | ULONG StartingY; 221 | ULONG CountX; 222 | ULONG CountY; 223 | ULONG CountCharsX; 224 | ULONG CountCharsY; 225 | ULONG FillAttribute; 226 | 227 | ULONG WindowFlags; 228 | ULONG ShowWindowFlags; 229 | UNICODE_STRING32 WindowTitle; 230 | UNICODE_STRING32 DesktopInfo; 231 | UNICODE_STRING32 ShellInfo; 232 | UNICODE_STRING32 RuntimeData; 233 | RTL_DRIVE_LETTER_CURDIR32 CurrentDirectories[RTL_MAX_DRIVE_LETTERS]; 234 | 235 | WOW64_POINTER(ULONG_PTR) EnvironmentSize; 236 | WOW64_POINTER(ULONG_PTR) EnvironmentVersion; 237 | WOW64_POINTER(PVOID) PackageDependencyData; 238 | ULONG ProcessGroupId; 239 | ULONG LoaderThreads; 240 | 241 | UNICODE_STRING32 RedirectionDllName; // REDSTONE4 242 | UNICODE_STRING32 HeapPartitionName; // 19H1 243 | WOW64_POINTER(ULONG_PTR) DefaultThreadpoolCpuSetMasks; 244 | ULONG DefaultThreadpoolCpuSetMaskCount; 245 | } RTL_USER_PROCESS_PARAMETERS32, *PRTL_USER_PROCESS_PARAMETERS32; 246 | 247 | typedef struct _PEB32 248 | { 249 | BOOLEAN InheritedAddressSpace; 250 | BOOLEAN ReadImageFileExecOptions; 251 | BOOLEAN BeingDebugged; 252 | union 253 | { 254 | BOOLEAN BitField; 255 | struct 256 | { 257 | BOOLEAN ImageUsesLargePages : 1; 258 | BOOLEAN IsProtectedProcess : 1; 259 | BOOLEAN IsImageDynamicallyRelocated : 1; 260 | BOOLEAN SkipPatchingUser32Forwarders : 1; 261 | BOOLEAN IsPackagedProcess : 1; 262 | BOOLEAN IsAppContainer : 1; 263 | BOOLEAN IsProtectedProcessLight : 1; 264 | BOOLEAN IsLongPathAwareProcess : 1; 265 | }; 266 | }; 267 | WOW64_POINTER(HANDLE) Mutant; 268 | 269 | WOW64_POINTER(PVOID) ImageBaseAddress; 270 | WOW64_POINTER(PPEB_LDR_DATA) Ldr; 271 | WOW64_POINTER(PRTL_USER_PROCESS_PARAMETERS) ProcessParameters; 272 | WOW64_POINTER(PVOID) SubSystemData; 273 | WOW64_POINTER(PVOID) ProcessHeap; 274 | WOW64_POINTER(PRTL_CRITICAL_SECTION) FastPebLock; 275 | WOW64_POINTER(PVOID) AtlThunkSListPtr; 276 | WOW64_POINTER(PVOID) IFEOKey; 277 | union 278 | { 279 | ULONG CrossProcessFlags; 280 | struct 281 | { 282 | ULONG ProcessInJob : 1; 283 | ULONG ProcessInitializing : 1; 284 | ULONG ProcessUsingVEH : 1; 285 | ULONG ProcessUsingVCH : 1; 286 | ULONG ProcessUsingFTH : 1; 287 | ULONG ReservedBits0 : 27; 288 | }; 289 | }; 290 | union 291 | { 292 | WOW64_POINTER(PVOID) KernelCallbackTable; 293 | WOW64_POINTER(PVOID) UserSharedInfoPtr; 294 | }; 295 | ULONG SystemReserved; 296 | ULONG AtlThunkSListPtr32; 297 | WOW64_POINTER(PVOID) ApiSetMap; 298 | ULONG TlsExpansionCounter; 299 | WOW64_POINTER(PVOID) TlsBitmap; 300 | ULONG TlsBitmapBits[2]; 301 | WOW64_POINTER(PVOID) ReadOnlySharedMemoryBase; 302 | WOW64_POINTER(PVOID) HotpatchInformation; 303 | WOW64_POINTER(PVOID *) ReadOnlyStaticServerData; 304 | WOW64_POINTER(PVOID) AnsiCodePageData; 305 | WOW64_POINTER(PVOID) OemCodePageData; 306 | WOW64_POINTER(PVOID) UnicodeCaseTableData; 307 | 308 | ULONG NumberOfProcessors; 309 | ULONG NtGlobalFlag; 310 | 311 | LARGE_INTEGER CriticalSectionTimeout; 312 | WOW64_POINTER(SIZE_T) HeapSegmentReserve; 313 | WOW64_POINTER(SIZE_T) HeapSegmentCommit; 314 | WOW64_POINTER(SIZE_T) HeapDeCommitTotalFreeThreshold; 315 | WOW64_POINTER(SIZE_T) HeapDeCommitFreeBlockThreshold; 316 | 317 | ULONG NumberOfHeaps; 318 | ULONG MaximumNumberOfHeaps; 319 | WOW64_POINTER(PVOID *) ProcessHeaps; 320 | 321 | WOW64_POINTER(PVOID) GdiSharedHandleTable; 322 | WOW64_POINTER(PVOID) ProcessStarterHelper; 323 | ULONG GdiDCAttributeList; 324 | 325 | WOW64_POINTER(PRTL_CRITICAL_SECTION) LoaderLock; 326 | 327 | ULONG OSMajorVersion; 328 | ULONG OSMinorVersion; 329 | USHORT OSBuildNumber; 330 | USHORT OSCSDVersion; 331 | ULONG OSPlatformId; 332 | ULONG ImageSubsystem; 333 | ULONG ImageSubsystemMajorVersion; 334 | ULONG ImageSubsystemMinorVersion; 335 | WOW64_POINTER(ULONG_PTR) ActiveProcessAffinityMask; 336 | GDI_HANDLE_BUFFER32 GdiHandleBuffer; 337 | WOW64_POINTER(PVOID) PostProcessInitRoutine; 338 | 339 | WOW64_POINTER(PVOID) TlsExpansionBitmap; 340 | ULONG TlsExpansionBitmapBits[32]; 341 | 342 | ULONG SessionId; 343 | 344 | ULARGE_INTEGER AppCompatFlags; 345 | ULARGE_INTEGER AppCompatFlagsUser; 346 | WOW64_POINTER(PVOID) pShimData; 347 | WOW64_POINTER(PVOID) AppCompatInfo; 348 | 349 | UNICODE_STRING32 CSDVersion; 350 | 351 | WOW64_POINTER(PVOID) ActivationContextData; 352 | WOW64_POINTER(PVOID) ProcessAssemblyStorageMap; 353 | WOW64_POINTER(PVOID) SystemDefaultActivationContextData; 354 | WOW64_POINTER(PVOID) SystemAssemblyStorageMap; 355 | 356 | WOW64_POINTER(SIZE_T) MinimumStackCommit; 357 | 358 | WOW64_POINTER(PVOID) SparePointers[4]; 359 | ULONG SpareUlongs[5]; 360 | //WOW64_POINTER(PVOID *) FlsCallback; 361 | //LIST_ENTRY32 FlsListHead; 362 | //WOW64_POINTER(PVOID) FlsBitmap; 363 | //ULONG FlsBitmapBits[FLS_MAXIMUM_AVAILABLE / (sizeof(ULONG) * 8)]; 364 | //ULONG FlsHighIndex; 365 | 366 | WOW64_POINTER(PVOID) WerRegistrationData; 367 | WOW64_POINTER(PVOID) WerShipAssertPtr; 368 | WOW64_POINTER(PVOID) pContextData; 369 | WOW64_POINTER(PVOID) pImageHeaderHash; 370 | union 371 | { 372 | ULONG TracingFlags; 373 | struct 374 | { 375 | ULONG HeapTracingEnabled : 1; 376 | ULONG CritSecTracingEnabled : 1; 377 | ULONG LibLoaderTracingEnabled : 1; 378 | ULONG SpareTracingBits : 29; 379 | }; 380 | }; 381 | ULONGLONG CsrServerReadOnlySharedMemoryBase; 382 | WOW64_POINTER(PVOID) TppWorkerpListLock; 383 | LIST_ENTRY32 TppWorkerpList; 384 | WOW64_POINTER(PVOID) WaitOnAddressHashTable[128]; 385 | WOW64_POINTER(PVOID) TelemetryCoverageHeader; // REDSTONE3 386 | ULONG CloudFileFlags; 387 | ULONG CloudFileDiagFlags; // REDSTONE4 388 | CHAR PlaceholderCompatibilityMode; 389 | CHAR PlaceholderCompatibilityModeReserved[7]; 390 | } PEB32, *PPEB32; 391 | 392 | C_ASSERT(FIELD_OFFSET(PEB32, IFEOKey) == 0x024); 393 | C_ASSERT(FIELD_OFFSET(PEB32, UnicodeCaseTableData) == 0x060); 394 | C_ASSERT(FIELD_OFFSET(PEB32, SystemAssemblyStorageMap) == 0x204); 395 | C_ASSERT(FIELD_OFFSET(PEB32, pImageHeaderHash) == 0x23c); 396 | C_ASSERT(FIELD_OFFSET(PEB32, WaitOnAddressHashTable) == 0x25c); 397 | //C_ASSERT(sizeof(PEB32) == 0x460); // REDSTONE3 398 | C_ASSERT(sizeof(PEB32) == 0x470); 399 | 400 | // Note: Use PhGetProcessPeb32 instead. (dmex) 401 | //#define WOW64_GET_PEB32(peb64) ((PPEB32)PTR_ADD_OFFSET((peb64), ALIGN_UP_BY(sizeof(PEB), PAGE_SIZE))) 402 | 403 | #define GDI_BATCH_BUFFER_SIZE 310 404 | 405 | typedef struct _GDI_TEB_BATCH32 406 | { 407 | ULONG Offset; 408 | WOW64_POINTER(ULONG_PTR) HDC; 409 | ULONG Buffer[GDI_BATCH_BUFFER_SIZE]; 410 | } GDI_TEB_BATCH32, *PGDI_TEB_BATCH32; 411 | 412 | typedef struct _TEB32 413 | { 414 | NT_TIB32 NtTib; 415 | 416 | WOW64_POINTER(PVOID) EnvironmentPointer; 417 | CLIENT_ID32 ClientId; 418 | WOW64_POINTER(PVOID) ActiveRpcHandle; 419 | WOW64_POINTER(PVOID) ThreadLocalStoragePointer; 420 | WOW64_POINTER(PPEB) ProcessEnvironmentBlock; 421 | 422 | ULONG LastErrorValue; 423 | ULONG CountOfOwnedCriticalSections; 424 | WOW64_POINTER(PVOID) CsrClientThread; 425 | WOW64_POINTER(PVOID) Win32ThreadInfo; 426 | ULONG User32Reserved[26]; 427 | ULONG UserReserved[5]; 428 | WOW64_POINTER(PVOID) WOW32Reserved; 429 | LCID CurrentLocale; 430 | ULONG FpSoftwareStatusRegister; 431 | WOW64_POINTER(PVOID) ReservedForDebuggerInstrumentation[16]; 432 | WOW64_POINTER(PVOID) SystemReserved1[36]; 433 | UCHAR WorkingOnBehalfTicket[8]; 434 | NTSTATUS ExceptionCode; 435 | 436 | WOW64_POINTER(PVOID) ActivationContextStackPointer; 437 | WOW64_POINTER(ULONG_PTR) InstrumentationCallbackSp; 438 | WOW64_POINTER(ULONG_PTR) InstrumentationCallbackPreviousPc; 439 | WOW64_POINTER(ULONG_PTR) InstrumentationCallbackPreviousSp; 440 | BOOLEAN InstrumentationCallbackDisabled; 441 | UCHAR SpareBytes[23]; 442 | ULONG TxFsContext; 443 | 444 | GDI_TEB_BATCH32 GdiTebBatch; 445 | CLIENT_ID32 RealClientId; 446 | WOW64_POINTER(HANDLE) GdiCachedProcessHandle; 447 | ULONG GdiClientPID; 448 | ULONG GdiClientTID; 449 | WOW64_POINTER(PVOID) GdiThreadLocalInfo; 450 | WOW64_POINTER(ULONG_PTR) Win32ClientInfo[62]; 451 | WOW64_POINTER(PVOID) glDispatchTable[233]; 452 | WOW64_POINTER(ULONG_PTR) glReserved1[29]; 453 | WOW64_POINTER(PVOID) glReserved2; 454 | WOW64_POINTER(PVOID) glSectionInfo; 455 | WOW64_POINTER(PVOID) glSection; 456 | WOW64_POINTER(PVOID) glTable; 457 | WOW64_POINTER(PVOID) glCurrentRC; 458 | WOW64_POINTER(PVOID) glContext; 459 | 460 | NTSTATUS LastStatusValue; 461 | UNICODE_STRING32 StaticUnicodeString; 462 | WCHAR StaticUnicodeBuffer[261]; 463 | 464 | WOW64_POINTER(PVOID) DeallocationStack; 465 | WOW64_POINTER(PVOID) TlsSlots[64]; 466 | LIST_ENTRY32 TlsLinks; 467 | 468 | WOW64_POINTER(PVOID) Vdm; 469 | WOW64_POINTER(PVOID) ReservedForNtRpc; 470 | WOW64_POINTER(PVOID) DbgSsReserved[2]; 471 | 472 | ULONG HardErrorMode; 473 | WOW64_POINTER(PVOID) Instrumentation[9]; 474 | GUID ActivityId; 475 | 476 | WOW64_POINTER(PVOID) SubProcessTag; 477 | WOW64_POINTER(PVOID) PerflibData; 478 | WOW64_POINTER(PVOID) EtwTraceData; 479 | WOW64_POINTER(PVOID) WinSockData; 480 | ULONG GdiBatchCount; 481 | 482 | union 483 | { 484 | PROCESSOR_NUMBER CurrentIdealProcessor; 485 | ULONG IdealProcessorValue; 486 | struct 487 | { 488 | UCHAR ReservedPad0; 489 | UCHAR ReservedPad1; 490 | UCHAR ReservedPad2; 491 | UCHAR IdealProcessor; 492 | }; 493 | }; 494 | 495 | ULONG GuaranteedStackBytes; 496 | WOW64_POINTER(PVOID) ReservedForPerf; 497 | WOW64_POINTER(PVOID) ReservedForOle; 498 | ULONG WaitingOnLoaderLock; 499 | WOW64_POINTER(PVOID) SavedPriorityState; 500 | WOW64_POINTER(ULONG_PTR) ReservedForCodeCoverage; 501 | WOW64_POINTER(PVOID) ThreadPoolData; 502 | WOW64_POINTER(PVOID *) TlsExpansionSlots; 503 | 504 | ULONG MuiGeneration; 505 | ULONG IsImpersonating; 506 | WOW64_POINTER(PVOID) NlsCache; 507 | WOW64_POINTER(PVOID) pShimData; 508 | USHORT HeapVirtualAffinity; 509 | USHORT LowFragHeapDataSlot; 510 | WOW64_POINTER(HANDLE) CurrentTransactionHandle; 511 | WOW64_POINTER(PTEB_ACTIVE_FRAME) ActiveFrame; 512 | WOW64_POINTER(PVOID) FlsData; 513 | 514 | WOW64_POINTER(PVOID) PreferredLanguages; 515 | WOW64_POINTER(PVOID) UserPrefLanguages; 516 | WOW64_POINTER(PVOID) MergedPrefLanguages; 517 | ULONG MuiImpersonation; 518 | 519 | union 520 | { 521 | USHORT CrossTebFlags; 522 | USHORT SpareCrossTebBits : 16; 523 | }; 524 | union 525 | { 526 | USHORT SameTebFlags; 527 | struct 528 | { 529 | USHORT SafeThunkCall : 1; 530 | USHORT InDebugPrint : 1; 531 | USHORT HasFiberData : 1; 532 | USHORT SkipThreadAttach : 1; 533 | USHORT WerInShipAssertCode : 1; 534 | USHORT RanProcessInit : 1; 535 | USHORT ClonedThread : 1; 536 | USHORT SuppressDebugMsg : 1; 537 | USHORT DisableUserStackWalk : 1; 538 | USHORT RtlExceptionAttached : 1; 539 | USHORT InitialThread : 1; 540 | USHORT SessionAware : 1; 541 | USHORT LoadOwner : 1; 542 | USHORT LoaderWorker : 1; 543 | USHORT SpareSameTebBits : 2; 544 | }; 545 | }; 546 | 547 | WOW64_POINTER(PVOID) TxnScopeEnterCallback; 548 | WOW64_POINTER(PVOID) TxnScopeExitCallback; 549 | WOW64_POINTER(PVOID) TxnScopeContext; 550 | ULONG LockCount; 551 | LONG WowTebOffset; 552 | WOW64_POINTER(PVOID) ResourceRetValue; 553 | WOW64_POINTER(PVOID) ReservedForWdf; 554 | ULONGLONG ReservedForCrt; 555 | GUID EffectiveContainerId; 556 | } TEB32, *PTEB32; 557 | 558 | C_ASSERT(FIELD_OFFSET(TEB32, ProcessEnvironmentBlock) == 0x030); 559 | C_ASSERT(FIELD_OFFSET(TEB32, ExceptionCode) == 0x1a4); 560 | C_ASSERT(FIELD_OFFSET(TEB32, TxFsContext) == 0x1d0); 561 | C_ASSERT(FIELD_OFFSET(TEB32, glContext) == 0xbf0); 562 | C_ASSERT(FIELD_OFFSET(TEB32, StaticUnicodeBuffer) == 0xc00); 563 | C_ASSERT(FIELD_OFFSET(TEB32, TlsLinks) == 0xf10); 564 | C_ASSERT(FIELD_OFFSET(TEB32, DbgSsReserved) == 0xf20); 565 | C_ASSERT(FIELD_OFFSET(TEB32, ActivityId) == 0xf50); 566 | C_ASSERT(FIELD_OFFSET(TEB32, GdiBatchCount) == 0xf70); 567 | C_ASSERT(FIELD_OFFSET(TEB32, TlsExpansionSlots) == 0xf94); 568 | C_ASSERT(FIELD_OFFSET(TEB32, FlsData) == 0xfb4); 569 | C_ASSERT(FIELD_OFFSET(TEB32, MuiImpersonation) == 0xfc4); 570 | C_ASSERT(FIELD_OFFSET(TEB32, ReservedForCrt) == 0xfe8); 571 | C_ASSERT(FIELD_OFFSET(TEB32, EffectiveContainerId) == 0xff0); 572 | C_ASSERT(sizeof(TEB32) == 0x1000); 573 | 574 | // Get the 32-bit TEB without doing a memory reference 575 | // modified from public SDK /10.0.10240.0/um/minwin/wow64t.h (dmex) 576 | #define WOW64_GET_TEB32(teb64) ((PTEB32)PTR_ADD_OFFSET((teb64), ALIGN_UP_BY(sizeof(TEB), PAGE_SIZE))) 577 | #define WOW64_TEB32_POINTER_ADDRESS(teb64) (PVOID)&((teb64)->NtTib.ExceptionList) 578 | 579 | // Conversion 580 | 581 | FORCEINLINE VOID UStr32ToUStr( 582 | _Out_ PUNICODE_STRING Destination, 583 | _In_ PUNICODE_STRING32 Source 584 | ) 585 | { 586 | Destination->Length = Source->Length; 587 | Destination->MaximumLength = Source->MaximumLength; 588 | Destination->Buffer = (PWCH)UlongToPtr(Source->Buffer); 589 | } 590 | 591 | FORCEINLINE VOID UStrToUStr32( 592 | _Out_ PUNICODE_STRING32 Destination, 593 | _In_ PUNICODE_STRING Source 594 | ) 595 | { 596 | Destination->Length = Source->Length; 597 | Destination->MaximumLength = Source->MaximumLength; 598 | Destination->Buffer = PtrToUlong(Source->Buffer); 599 | } 600 | 601 | #endif 602 | -------------------------------------------------------------------------------- /pnth/ntxcapi.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _NTXCAPI_H 13 | #define _NTXCAPI_H 14 | 15 | NTSYSAPI 16 | BOOLEAN 17 | NTAPI 18 | RtlDispatchException( 19 | _In_ PEXCEPTION_RECORD ExceptionRecord, 20 | _In_ PCONTEXT ContextRecord 21 | ); 22 | 23 | NTSYSAPI 24 | DECLSPEC_NORETURN 25 | VOID 26 | NTAPI 27 | RtlRaiseStatus( 28 | _In_ NTSTATUS Status 29 | ); 30 | 31 | NTSYSAPI 32 | VOID 33 | NTAPI 34 | RtlRaiseException( 35 | _In_ PEXCEPTION_RECORD ExceptionRecord 36 | ); 37 | 38 | NTSYSCALLAPI 39 | NTSTATUS 40 | NTAPI 41 | NtContinue( 42 | _In_ PCONTEXT ContextRecord, 43 | _In_ BOOLEAN TestAlert 44 | ); 45 | 46 | #if (PHNT_VERSION >= PHNT_THRESHOLD) 47 | typedef enum _KCONTINUE_TYPE 48 | { 49 | KCONTINUE_UNWIND, 50 | KCONTINUE_RESUME, 51 | KCONTINUE_LONGJUMP, 52 | KCONTINUE_SET, 53 | KCONTINUE_LAST, 54 | } KCONTINUE_TYPE; 55 | 56 | typedef struct _KCONTINUE_ARGUMENT 57 | { 58 | KCONTINUE_TYPE ContinueType; 59 | ULONG ContinueFlags; 60 | ULONGLONG Reserved[2]; 61 | } KCONTINUE_ARGUMENT, *PKCONTINUE_ARGUMENT; 62 | 63 | #define KCONTINUE_FLAG_TEST_ALERT 0x00000001 // wbenny 64 | #define KCONTINUE_FLAG_DELIVER_APC 0x00000002 // wbenny 65 | 66 | NTSYSCALLAPI 67 | NTSTATUS 68 | NTAPI 69 | NtContinueEx( 70 | _In_ PCONTEXT ContextRecord, 71 | _In_ PVOID ContinueArgument // PKCONTINUE_ARGUMENT and BOOLEAN are valid 72 | ); 73 | 74 | //FORCEINLINE 75 | //NTSTATUS 76 | //NtContinue( 77 | // _In_ PCONTEXT ContextRecord, 78 | // _In_ BOOLEAN TestAlert 79 | // ) 80 | //{ 81 | // return NtContinueEx(ContextRecord, (PCONTINUE_ARGUMENT)TestAlert); 82 | //} 83 | #endif 84 | 85 | NTSYSCALLAPI 86 | NTSTATUS 87 | NTAPI 88 | NtRaiseException( 89 | _In_ PEXCEPTION_RECORD ExceptionRecord, 90 | _In_ PCONTEXT ContextRecord, 91 | _In_ BOOLEAN FirstChance 92 | ); 93 | 94 | __analysis_noreturn 95 | NTSYSCALLAPI 96 | VOID 97 | NTAPI 98 | RtlAssert( 99 | _In_ PVOID VoidFailedAssertion, 100 | _In_ PVOID VoidFileName, 101 | _In_ ULONG LineNumber, 102 | _In_opt_ PSTR MutableMessage 103 | ); 104 | 105 | #define RTL_ASSERT(exp) \ 106 | ((!(exp)) ? (RtlAssert((PVOID)#exp, (PVOID)__FILE__, __LINE__, NULL), FALSE) : TRUE) 107 | #define RTL_ASSERTMSG(msg, exp) \ 108 | ((!(exp)) ? (RtlAssert((PVOID)#exp, (PVOID)__FILE__, __LINE__, msg), FALSE) : TRUE) 109 | #define RTL_SOFT_ASSERT(_exp) \ 110 | ((!(_exp)) ? (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n", __FILE__, __LINE__, #_exp), FALSE) : TRUE) 111 | #define RTL_SOFT_ASSERTMSG(_msg, _exp) \ 112 | ((!(_exp)) ? (DbgPrint("%s(%d): Soft assertion failed\n Expression: %s\n Message: %s\n", __FILE__, __LINE__, #_exp, (_msg)), FALSE) : TRUE) 113 | 114 | #endif 115 | -------------------------------------------------------------------------------- /pnth/pch.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #define DECLSPEC_DEPRECATED_DDK 4 | 5 | #define _CRT_SECURE_NO_DEPRECATE 6 | #define _CRT_NON_CONFORMING_SWPRINTFS 7 | #define _NO_CRT_STDIO_INLINE 8 | #define _NO_CPP_INLINES 9 | #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 0 10 | #define _ALLOW_COMPILER_AND_STL_VERSION_MISMATCH 11 | #define __EDG__ 12 | #define USE_ATL_THUNK2 13 | 14 | #define CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS 15 | #define CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS 16 | 17 | #ifndef DECLSPEC_IMPORT 18 | #define DECLSPEC_IMPORT __declspec(dllimport) 19 | #endif 20 | 21 | #define DPAPI_IMP DECLSPEC_IMPORT 22 | #define _CRTIMP DECLSPEC_IMPORT 23 | #define _CRTIMP_ALT DECLSPEC_IMPORT 24 | 25 | #define _NT_BEGIN namespace NT { 26 | #define _NT_END } 27 | 28 | #pragma warning(disable : 4073 4074 4075 4097 4514 4005 4200 4201 4238 4307 4324 4392 4471 4480 4530 4706 5040) 29 | 30 | #include 31 | // #include 32 | #include 33 | #include 34 | 35 | #include 36 | #include 37 | #include 38 | #undef WIN32_NO_STATUS 39 | #include 40 | #include 41 | 42 | //#include 43 | //#include 44 | 45 | typedef GUID *PGUID; 46 | 47 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; 48 | 49 | #ifndef PHNT_MODE 50 | #define PHNT_MODE PHNT_MODE_USER 51 | #endif 52 | 53 | #ifndef PHNT_VERSION 54 | #define PHNT_VERSION PHNT_WIN11_22H2 55 | #endif 56 | 57 | #if PHNT_MODE == PHNT_MODE_USER 58 | #define SECURITY_WIN32 59 | #endif 60 | 61 | //#define _NTLSA_ 62 | 63 | #define PHNT_NO_INLINE_INIT_STRING 64 | 65 | #pragma warning(disable : 4073 4074 4075 4097 4514 4005 4200 4201 4238 4307 4324 4392 4471 4480 4530 4706 5040) 66 | #include "phnt.h" 67 | #pragma warning(default : 4392) 68 | 69 | #define MINCHAR 0x80 // winnt 70 | #define MAXCHAR 0x7f // winnt 71 | #define MINSHORT 0x8000 // winnt 72 | #define MAXSHORT 0x7fff // winnt 73 | #define MINLONG 0x80000000 // winnt 74 | #define MAXLONG 0x7fffffff // winnt 75 | #define MAXUCHAR 0xff // winnt 76 | #define MAXUSHORT 0xffff // winnt 77 | #define MAXULONG 0xffffffff // winnt 78 | 79 | #include "mini_yvals.h" 80 | -------------------------------------------------------------------------------- /pnth/phnt.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _PHNT_H 13 | #define _PHNT_H 14 | 15 | // This header file provides access to NT APIs. 16 | 17 | // Definitions are annotated to indicate their source. If a definition is not annotated, it has been 18 | // retrieved from an official Microsoft source (NT headers, DDK headers, winnt.h). 19 | 20 | // * "winbase" indicates that a definition has been reconstructed from a Win32-ized NT definition in 21 | // winbase.h. 22 | // * "rev" indicates that a definition has been reverse-engineered. 23 | // * "dbg" indicates that a definition has been obtained from a debug message or assertion in a 24 | // checked build of the kernel or file. 25 | 26 | // Reliability: 27 | // 1. No annotation. 28 | // 2. dbg. 29 | // 3. symbols, private. Types may be incorrect. 30 | // 4. winbase. Names and types may be incorrect. 31 | // 5. rev. 32 | 33 | // Mode 34 | #define PHNT_MODE_KERNEL 0 35 | #define PHNT_MODE_USER 1 36 | 37 | // Version 38 | #define PHNT_WIN2K 50 39 | #define PHNT_WINXP 51 40 | #define PHNT_WS03 52 41 | #define PHNT_VISTA 60 42 | #define PHNT_WIN7 61 43 | #define PHNT_WIN8 62 44 | #define PHNT_WINBLUE 63 45 | #define PHNT_THRESHOLD 100 46 | #define PHNT_THRESHOLD2 101 47 | #define PHNT_REDSTONE 102 48 | #define PHNT_REDSTONE2 103 49 | #define PHNT_REDSTONE3 104 50 | #define PHNT_REDSTONE4 105 51 | #define PHNT_REDSTONE5 106 52 | #define PHNT_19H1 107 53 | #define PHNT_19H2 108 54 | #define PHNT_20H1 109 55 | #define PHNT_20H2 110 56 | #define PHNT_21H1 111 57 | #define PHNT_21H2 112 58 | #define PHNT_WIN11 113 59 | #define PHNT_WIN11_22H2 114 60 | 61 | #ifndef PHNT_MODE 62 | #define PHNT_MODE PHNT_MODE_USER 63 | #endif 64 | 65 | #ifndef PHNT_VERSION 66 | #define PHNT_VERSION PHNT_WIN7 67 | #endif 68 | 69 | #ifndef PAGE_SIZE 70 | #define PAGE_SIZE 0x1000 71 | #endif // !1 72 | 73 | 74 | // Options 75 | 76 | #ifndef _DATAIMP 77 | #define _DATAIMP __declspec(dllimport) 78 | #endif 79 | 80 | 81 | #ifdef __cplusplus 82 | extern "C" { 83 | #endif 84 | 85 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 86 | #include 87 | #include 88 | #include 89 | #endif 90 | 91 | #include 92 | #include 93 | 94 | #include 95 | #include 96 | #include 97 | #include 98 | 99 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 100 | #include 101 | #include 102 | #include 103 | #include 104 | #include 105 | #include 106 | #include 107 | #include 108 | #include 109 | #endif 110 | 111 | #if (PHNT_MODE != PHNT_MODE_KERNEL) 112 | 113 | #include 114 | #include 115 | #include 116 | #include 117 | 118 | #include 119 | 120 | #include 121 | #include 122 | 123 | #include 124 | 125 | #include 126 | 127 | #endif 128 | 129 | #ifdef __cplusplus 130 | } 131 | #endif 132 | 133 | #endif 134 | -------------------------------------------------------------------------------- /pnth/phnt_ntdef.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _PHNT_NTDEF_H 13 | #define _PHNT_NTDEF_H 14 | 15 | #ifndef _NTDEF_ 16 | #define _NTDEF_ 17 | 18 | // This header file provides basic NT types not included in Win32. If you have included winnt.h 19 | // (perhaps indirectly), you must use this file instead of ntdef.h. 20 | 21 | #ifndef NOTHING 22 | #define NOTHING 23 | #endif 24 | 25 | // Basic types 26 | 27 | typedef struct _QUAD 28 | { 29 | union 30 | { 31 | __int64 UseThisFieldToCopy; 32 | double DoNotUseThisField; 33 | }; 34 | } QUAD, *PQUAD; 35 | 36 | // This isn't in NT, but it's useful. 37 | typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _QUAD_PTR 38 | { 39 | ULONG_PTR DoNotUseThisField1; 40 | ULONG_PTR DoNotUseThisField2; 41 | } QUAD_PTR, *PQUAD_PTR; 42 | 43 | typedef ULONG LOGICAL; 44 | typedef ULONG *PLOGICAL; 45 | 46 | typedef _Return_type_success_(return >= 0) LONG NTSTATUS; 47 | typedef NTSTATUS *PNTSTATUS; 48 | 49 | // Cardinal types 50 | 51 | typedef char CCHAR; 52 | typedef short CSHORT; 53 | typedef ULONG CLONG; 54 | 55 | typedef CCHAR *PCCHAR; 56 | typedef CSHORT *PCSHORT; 57 | typedef CLONG *PCLONG; 58 | 59 | typedef PCSTR PCSZ; 60 | 61 | // Specific 62 | 63 | typedef UCHAR KIRQL, *PKIRQL; 64 | typedef LONG KPRIORITY, *PKPRIORITY; 65 | typedef USHORT RTL_ATOM, *PRTL_ATOM; 66 | 67 | typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS; 68 | 69 | typedef struct _LARGE_INTEGER_128 70 | { 71 | LONGLONG QuadPart[2]; 72 | } LARGE_INTEGER_128, *PLARGE_INTEGER_128; 73 | 74 | // NT status macros 75 | 76 | #define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0) 77 | #define NT_INFORMATION(Status) ((((ULONG)(Status)) >> 30) == 1) 78 | #define NT_WARNING(Status) ((((ULONG)(Status)) >> 30) == 2) 79 | #define NT_ERROR(Status) ((((ULONG)(Status)) >> 30) == 3) 80 | 81 | #define NT_FACILITY_MASK 0xfff 82 | #define NT_FACILITY_SHIFT 16 83 | #define NT_FACILITY(Status) ((((ULONG)(Status)) >> NT_FACILITY_SHIFT) & NT_FACILITY_MASK) 84 | 85 | #define NT_NTWIN32(Status) (NT_FACILITY(Status) == FACILITY_NTWIN32) 86 | #define WIN32_FROM_NTSTATUS(Status) (((ULONG)(Status)) & 0xffff) 87 | 88 | // Functions 89 | 90 | #ifndef _WIN64 91 | #define FASTCALL __fastcall 92 | #else 93 | #define FASTCALL 94 | #endif 95 | 96 | // Synchronization enumerations 97 | 98 | typedef enum _EVENT_TYPE 99 | { 100 | NotificationEvent, 101 | SynchronizationEvent 102 | } EVENT_TYPE; 103 | 104 | typedef enum _TIMER_TYPE 105 | { 106 | NotificationTimer, 107 | SynchronizationTimer 108 | } TIMER_TYPE; 109 | 110 | typedef enum _WAIT_TYPE 111 | { 112 | WaitAll, 113 | WaitAny, 114 | WaitNotification 115 | } WAIT_TYPE; 116 | 117 | // Strings 118 | 119 | typedef struct _STRING 120 | { 121 | USHORT Length; 122 | USHORT MaximumLength; 123 | _Field_size_bytes_part_opt_(MaximumLength, Length) PCHAR Buffer; 124 | } STRING, *PSTRING, ANSI_STRING, *PANSI_STRING, OEM_STRING, *POEM_STRING; 125 | 126 | #define MAXUSHORT 0xffff 127 | 128 | typedef struct _CSTRING { 129 | USHORT Length; 130 | USHORT MaximumLength; 131 | CONST char *Buffer; 132 | } CSTRING; 133 | 134 | typedef CSTRING *PCSTRING; 135 | 136 | typedef STRING UTF8_STRING; 137 | typedef PSTRING PUTF8_STRING; 138 | 139 | typedef const ANSI_STRING *PCANSI_STRING; 140 | typedef const OEM_STRING *PCOEM_STRING; 141 | 142 | typedef struct _UNICODE_STRING 143 | { 144 | USHORT Length; 145 | USHORT MaximumLength; 146 | _Field_size_bytes_part_(MaximumLength, Length) PWCH Buffer; 147 | } UNICODE_STRING, *PUNICODE_STRING; 148 | 149 | typedef const UNICODE_STRING *PCUNICODE_STRING; 150 | 151 | #ifdef __cplusplus 152 | extern "C++" 153 | { 154 | char _RTL_CONSTANT_STRING_type_check(const char *s); 155 | char _RTL_CONSTANT_STRING_type_check(const WCHAR *s); 156 | // __typeof would be desirable here instead of sizeof. 157 | template class _RTL_CONSTANT_STRING_remove_const_template_class; 158 | template <> class _RTL_CONSTANT_STRING_remove_const_template_class {public: typedef char T; }; 159 | template <> class _RTL_CONSTANT_STRING_remove_const_template_class {public: typedef WCHAR T; }; 160 | #define _RTL_CONSTANT_STRING_remove_const_macro(s) \ 161 | (const_cast<_RTL_CONSTANT_STRING_remove_const_template_class::T*>(s)) 162 | } 163 | #else 164 | char _RTL_CONSTANT_STRING_type_check(const void *s); 165 | #define _RTL_CONSTANT_STRING_remove_const_macro(s) (s) 166 | #endif 167 | #define RTL_CONSTANT_STRING(s) \ 168 | { \ 169 | sizeof( s ) - sizeof( (s)[0] ), \ 170 | sizeof( s ) / sizeof(_RTL_CONSTANT_STRING_type_check(s)), \ 171 | _RTL_CONSTANT_STRING_remove_const_macro(s) \ 172 | } 173 | 174 | // Balanced tree node 175 | 176 | #define RTL_BALANCED_NODE_RESERVED_PARENT_MASK 3 177 | 178 | typedef struct _RTL_BALANCED_NODE 179 | { 180 | union 181 | { 182 | struct _RTL_BALANCED_NODE *Children[2]; 183 | struct 184 | { 185 | struct _RTL_BALANCED_NODE *Left; 186 | struct _RTL_BALANCED_NODE *Right; 187 | }; 188 | }; 189 | union 190 | { 191 | UCHAR Red : 1; 192 | UCHAR Balance : 2; 193 | ULONG_PTR ParentValue; 194 | }; 195 | } RTL_BALANCED_NODE, *PRTL_BALANCED_NODE; 196 | 197 | #define RTL_BALANCED_NODE_GET_PARENT_POINTER(Node) \ 198 | ((PRTL_BALANCED_NODE)((Node)->ParentValue & ~RTL_BALANCED_NODE_RESERVED_PARENT_MASK)) 199 | 200 | // Portability 201 | 202 | typedef struct _SINGLE_LIST_ENTRY32 203 | { 204 | ULONG Next; 205 | } SINGLE_LIST_ENTRY32, *PSINGLE_LIST_ENTRY32; 206 | 207 | typedef struct _STRING32 208 | { 209 | USHORT Length; 210 | USHORT MaximumLength; 211 | ULONG Buffer; 212 | } STRING32, *PSTRING32; 213 | 214 | typedef STRING32 UNICODE_STRING32, *PUNICODE_STRING32; 215 | typedef STRING32 ANSI_STRING32, *PANSI_STRING32; 216 | 217 | typedef struct _STRING64 218 | { 219 | USHORT Length; 220 | USHORT MaximumLength; 221 | ULONGLONG Buffer; 222 | } STRING64, *PSTRING64; 223 | 224 | typedef STRING64 UNICODE_STRING64, *PUNICODE_STRING64; 225 | typedef STRING64 ANSI_STRING64, *PANSI_STRING64; 226 | 227 | // Object attributes 228 | 229 | #define OBJ_PROTECT_CLOSE 0x00000001 230 | #define OBJ_INHERIT 0x00000002 231 | #define OBJ_AUDIT_OBJECT_CLOSE 0x00000004 232 | #define OBJ_PERMANENT 0x00000010 233 | #define OBJ_EXCLUSIVE 0x00000020 234 | #define OBJ_CASE_INSENSITIVE 0x00000040 235 | #define OBJ_OPENIF 0x00000080 236 | #define OBJ_OPENLINK 0x00000100 237 | #define OBJ_KERNEL_HANDLE 0x00000200 238 | #define OBJ_FORCE_ACCESS_CHECK 0x00000400 239 | #define OBJ_IGNORE_IMPERSONATED_DEVICEMAP 0x00000800 240 | #define OBJ_DONT_REPARSE 0x00001000 241 | #define OBJ_VALID_ATTRIBUTES 0x00001ff2 242 | 243 | typedef struct _OBJECT_ATTRIBUTES 244 | { 245 | ULONG Length; 246 | HANDLE RootDirectory; 247 | PUNICODE_STRING ObjectName; 248 | ULONG Attributes; 249 | PVOID SecurityDescriptor; // PSECURITY_DESCRIPTOR; 250 | PVOID SecurityQualityOfService; // PSECURITY_QUALITY_OF_SERVICE 251 | } OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES; 252 | 253 | typedef const OBJECT_ATTRIBUTES *PCOBJECT_ATTRIBUTES; 254 | 255 | #define InitializeObjectAttributes(p, n, a, r, s) { \ 256 | (p)->Length = sizeof(OBJECT_ATTRIBUTES); \ 257 | (p)->RootDirectory = r; \ 258 | (p)->Attributes = a; \ 259 | (p)->ObjectName = n; \ 260 | (p)->SecurityDescriptor = s; \ 261 | (p)->SecurityQualityOfService = NULL; \ 262 | } 263 | 264 | #define RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) { sizeof(OBJECT_ATTRIBUTES), NULL, n, a, NULL, NULL } 265 | #define RTL_INIT_OBJECT_ATTRIBUTES(n, a) RTL_CONSTANT_OBJECT_ATTRIBUTES(n, a) 266 | 267 | #define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\') 268 | #define OBJ_NAME_ALTPATH_SEPARATOR ((WCHAR)L'/') 269 | 270 | // Portability 271 | 272 | typedef struct _OBJECT_ATTRIBUTES64 273 | { 274 | ULONG Length; 275 | ULONG64 RootDirectory; 276 | ULONG64 ObjectName; 277 | ULONG Attributes; 278 | ULONG64 SecurityDescriptor; 279 | ULONG64 SecurityQualityOfService; 280 | } OBJECT_ATTRIBUTES64, *POBJECT_ATTRIBUTES64; 281 | 282 | typedef const OBJECT_ATTRIBUTES64 *PCOBJECT_ATTRIBUTES64; 283 | 284 | typedef struct _OBJECT_ATTRIBUTES32 285 | { 286 | ULONG Length; 287 | ULONG RootDirectory; 288 | ULONG ObjectName; 289 | ULONG Attributes; 290 | ULONG SecurityDescriptor; 291 | ULONG SecurityQualityOfService; 292 | } OBJECT_ATTRIBUTES32, *POBJECT_ATTRIBUTES32; 293 | 294 | typedef const OBJECT_ATTRIBUTES32 *PCOBJECT_ATTRIBUTES32; 295 | 296 | // Product types 297 | 298 | typedef enum _NT_PRODUCT_TYPE 299 | { 300 | NtProductWinNt = 1, 301 | NtProductLanManNt, 302 | NtProductServer 303 | } NT_PRODUCT_TYPE, *PNT_PRODUCT_TYPE; 304 | 305 | typedef enum _SUITE_TYPE 306 | { 307 | SmallBusiness, 308 | Enterprise, 309 | BackOffice, 310 | CommunicationServer, 311 | TerminalServer, 312 | SmallBusinessRestricted, 313 | EmbeddedNT, 314 | DataCenter, 315 | SingleUserTS, 316 | Personal, 317 | Blade, 318 | EmbeddedRestricted, 319 | SecurityAppliance, 320 | StorageServer, 321 | ComputeServer, 322 | WHServer, 323 | PhoneNT, 324 | MaxSuiteType 325 | } SUITE_TYPE; 326 | 327 | // Specific 328 | 329 | typedef struct _CLIENT_ID 330 | { 331 | HANDLE UniqueProcess; 332 | HANDLE UniqueThread; 333 | } CLIENT_ID, *PCLIENT_ID; 334 | 335 | typedef struct _CLIENT_ID32 336 | { 337 | ULONG UniqueProcess; 338 | ULONG UniqueThread; 339 | } CLIENT_ID32, *PCLIENT_ID32; 340 | 341 | typedef struct _CLIENT_ID64 342 | { 343 | ULONGLONG UniqueProcess; 344 | ULONGLONG UniqueThread; 345 | } CLIENT_ID64, *PCLIENT_ID64; 346 | 347 | #include 348 | 349 | typedef struct _KSYSTEM_TIME 350 | { 351 | ULONG LowPart; 352 | LONG High1Time; 353 | LONG High2Time; 354 | } KSYSTEM_TIME, *PKSYSTEM_TIME; 355 | 356 | #include 357 | 358 | // NT macros used to test, set and clear flags 359 | #ifndef FlagOn 360 | #define FlagOn(_F, _SF) ((_F) & (_SF)) 361 | #endif 362 | #ifndef BooleanFlagOn 363 | #define BooleanFlagOn(F, SF) ((BOOLEAN)(((F) & (SF)) != 0)) 364 | #endif 365 | #ifndef SetFlag 366 | #define SetFlag(_F, _SF) ((_F) |= (_SF)) 367 | #endif 368 | #ifndef ClearFlag 369 | #define ClearFlag(_F, _SF) ((_F) &= ~(_SF)) 370 | #endif 371 | 372 | #endif 373 | 374 | #endif 375 | -------------------------------------------------------------------------------- /pnth/phnt_windows.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _PHNT_WINDOWS_H 13 | #define _PHNT_WINDOWS_H 14 | 15 | // This header file provides access to Win32, plus NTSTATUS values and some access mask values. 16 | 17 | #ifndef __cplusplus 18 | #ifndef CINTERFACE 19 | #define CINTERFACE 20 | #endif 21 | 22 | #ifndef COBJMACROS 23 | #define COBJMACROS 24 | #endif 25 | #endif 26 | 27 | #ifndef INITGUID 28 | #define INITGUID 29 | #endif 30 | 31 | #ifndef WIN32_LEAN_AND_MEAN 32 | #define WIN32_LEAN_AND_MEAN 33 | #endif 34 | 35 | #ifndef WIN32_NO_STATUS 36 | #define WIN32_NO_STATUS 37 | #endif 38 | 39 | #ifndef __cplusplus 40 | // This is needed to workaround C17 preprocessor errors when using legacy versions of the Windows SDK. (dmex) 41 | #ifndef MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS 42 | #define MICROSOFT_WINDOWS_WINBASE_H_DEFINE_INTERLOCKED_CPLUSPLUS_OVERLOADS 0 43 | #endif 44 | #endif 45 | 46 | #include 47 | #include 48 | #undef WIN32_NO_STATUS 49 | #include 50 | #include 51 | 52 | typedef double DOUBLE; 53 | typedef GUID *PGUID; 54 | 55 | // Desktop access rights 56 | #define DESKTOP_ALL_ACCESS \ 57 | (DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE | \ 58 | DESKTOP_HOOKCONTROL | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | \ 59 | DESKTOP_READOBJECTS | DESKTOP_SWITCHDESKTOP | DESKTOP_WRITEOBJECTS | \ 60 | STANDARD_RIGHTS_REQUIRED) 61 | #define DESKTOP_GENERIC_READ \ 62 | (DESKTOP_ENUMERATE | DESKTOP_READOBJECTS | STANDARD_RIGHTS_READ) 63 | #define DESKTOP_GENERIC_WRITE \ 64 | (DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_HOOKCONTROL | \ 65 | DESKTOP_JOURNALPLAYBACK | DESKTOP_JOURNALRECORD | DESKTOP_WRITEOBJECTS | \ 66 | STANDARD_RIGHTS_WRITE) 67 | #define DESKTOP_GENERIC_EXECUTE \ 68 | (DESKTOP_SWITCHDESKTOP | STANDARD_RIGHTS_EXECUTE) 69 | 70 | // Window station access rights 71 | #define WINSTA_GENERIC_READ \ 72 | (WINSTA_ENUMDESKTOPS | WINSTA_ENUMERATE | WINSTA_READATTRIBUTES | \ 73 | WINSTA_READSCREEN | STANDARD_RIGHTS_READ) 74 | #define WINSTA_GENERIC_WRITE \ 75 | (WINSTA_ACCESSCLIPBOARD | WINSTA_CREATEDESKTOP | WINSTA_WRITEATTRIBUTES | \ 76 | STANDARD_RIGHTS_WRITE) 77 | #define WINSTA_GENERIC_EXECUTE \ 78 | (WINSTA_ACCESSGLOBALATOMS | WINSTA_EXITWINDOWS | STANDARD_RIGHTS_EXECUTE) 79 | 80 | // WMI access rights 81 | #define WMIGUID_GENERIC_READ \ 82 | (WMIGUID_QUERY | WMIGUID_NOTIFICATION | WMIGUID_READ_DESCRIPTION | \ 83 | STANDARD_RIGHTS_READ) 84 | #define WMIGUID_GENERIC_WRITE \ 85 | (WMIGUID_SET | TRACELOG_CREATE_REALTIME | TRACELOG_CREATE_ONDISK | \ 86 | STANDARD_RIGHTS_WRITE) 87 | #define WMIGUID_GENERIC_EXECUTE \ 88 | (WMIGUID_EXECUTE | TRACELOG_GUID_ENABLE | TRACELOG_LOG_EVENT | \ 89 | TRACELOG_ACCESS_REALTIME | TRACELOG_REGISTER_GUIDS | \ 90 | STANDARD_RIGHTS_EXECUTE) 91 | 92 | #endif 93 | -------------------------------------------------------------------------------- /pnth/rtlframe.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | struct _RTL_FRAME : TEB_ACTIVE_FRAME 4 | { 5 | _RTL_FRAME(const TEB_ACTIVE_FRAME_CONTEXT* ctx) 6 | { 7 | Context = ctx; 8 | Flags = 0; 9 | RtlPushFrame(this); 10 | } 11 | 12 | ~_RTL_FRAME() 13 | { 14 | RtlPopFrame(this); 15 | } 16 | 17 | static TEB_ACTIVE_FRAME* get(const TEB_ACTIVE_FRAME_CONTEXT* ctx) 18 | { 19 | if (TEB_ACTIVE_FRAME* prf = RtlGetFrame()) 20 | { 21 | do 22 | { 23 | if (prf->Context == ctx) return prf; 24 | } while (prf = prf->Previous); 25 | } 26 | 27 | return 0; 28 | } 29 | }; 30 | 31 | template 32 | struct RTL_FRAME : public _RTL_FRAME, public Base 33 | { 34 | static const TEB_ACTIVE_FRAME_CONTEXT* getContext() 35 | { 36 | static const TEB_ACTIVE_FRAME_CONTEXT s = { 0, __FUNCDNAME__ }; 37 | return &s; 38 | } 39 | 40 | template 41 | RTL_FRAME(Types... args) : Base(args...), _RTL_FRAME(getContext()) 42 | { 43 | } 44 | 45 | static Base* get() 46 | { 47 | #ifdef _PRINT_CPP_NAMES_ 48 | __pragma(message("; " __FUNCSIG__ "\r\nextern " __FUNCDNAME__ " : PROC")) 49 | #endif 50 | return static_cast(_RTL_FRAME::get(getContext())); 51 | } 52 | }; 53 | -------------------------------------------------------------------------------- /pnth/subprocesstag.h: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of the Process Hacker project - https://processhacker.sourceforge.io/ 3 | * 4 | * You can redistribute this file and/or modify it under the terms of the 5 | * Attribution 4.0 International (CC BY 4.0) license. 6 | * 7 | * You must give appropriate credit, provide a link to the license, and 8 | * indicate if changes were made. You may do so in any reasonable manner, but 9 | * not in any way that suggests the licensor endorses you or your use. 10 | */ 11 | 12 | #ifndef _SUBPROCESSTAG_H 13 | #define _SUBPROCESSTAG_H 14 | 15 | typedef enum _TAG_INFO_LEVEL 16 | { 17 | eTagInfoLevelNameFromTag = 1, // TAG_INFO_NAME_FROM_TAG 18 | eTagInfoLevelNamesReferencingModule, // TAG_INFO_NAMES_REFERENCING_MODULE 19 | eTagInfoLevelNameTagMapping, // TAG_INFO_NAME_TAG_MAPPING 20 | eTagInfoLevelMax 21 | } TAG_INFO_LEVEL; 22 | 23 | typedef enum _TAG_TYPE 24 | { 25 | eTagTypeService = 1, 26 | eTagTypeMax 27 | } TAG_TYPE; 28 | 29 | typedef struct _TAG_INFO_NAME_FROM_TAG_IN_PARAMS 30 | { 31 | ULONG dwPid; 32 | ULONG dwTag; 33 | } TAG_INFO_NAME_FROM_TAG_IN_PARAMS, *PTAG_INFO_NAME_FROM_TAG_IN_PARAMS; 34 | 35 | typedef struct _TAG_INFO_NAME_FROM_TAG_OUT_PARAMS 36 | { 37 | ULONG eTagType; 38 | PWSTR pszName; 39 | } TAG_INFO_NAME_FROM_TAG_OUT_PARAMS, *PTAG_INFO_NAME_FROM_TAG_OUT_PARAMS; 40 | 41 | typedef struct _TAG_INFO_NAME_FROM_TAG 42 | { 43 | TAG_INFO_NAME_FROM_TAG_IN_PARAMS InParams; 44 | TAG_INFO_NAME_FROM_TAG_OUT_PARAMS OutParams; 45 | } TAG_INFO_NAME_FROM_TAG, *PTAG_INFO_NAME_FROM_TAG; 46 | 47 | typedef struct _TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS 48 | { 49 | ULONG dwPid; 50 | PWSTR pszModule; 51 | } TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS, *PTAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS; 52 | 53 | typedef struct _TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS 54 | { 55 | ULONG eTagType; 56 | PWSTR pmszNames; 57 | } TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS, *PTAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS; 58 | 59 | typedef struct _TAG_INFO_NAMES_REFERENCING_MODULE 60 | { 61 | TAG_INFO_NAMES_REFERENCING_MODULE_IN_PARAMS InParams; 62 | TAG_INFO_NAMES_REFERENCING_MODULE_OUT_PARAMS OutParams; 63 | } TAG_INFO_NAMES_REFERENCING_MODULE, *PTAG_INFO_NAMES_REFERENCING_MODULE; 64 | 65 | typedef struct _TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS 66 | { 67 | ULONG dwPid; 68 | } TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS, *PTAG_INFO_NAME_TAG_MAPPING_IN_PARAMS; 69 | 70 | typedef struct _TAG_INFO_NAME_TAG_MAPPING_ELEMENT 71 | { 72 | ULONG eTagType; 73 | ULONG dwTag; 74 | PWSTR pszName; 75 | PWSTR pszGroupName; 76 | } TAG_INFO_NAME_TAG_MAPPING_ELEMENT, *PTAG_INFO_NAME_TAG_MAPPING_ELEMENT; 77 | 78 | typedef struct _TAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS 79 | { 80 | ULONG cElements; 81 | PTAG_INFO_NAME_TAG_MAPPING_ELEMENT pNameTagMappingElements; 82 | } TAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS, *PTAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS; 83 | 84 | typedef struct _TAG_INFO_NAME_TAG_MAPPING 85 | { 86 | TAG_INFO_NAME_TAG_MAPPING_IN_PARAMS InParams; 87 | PTAG_INFO_NAME_TAG_MAPPING_OUT_PARAMS pOutParams; 88 | } TAG_INFO_NAME_TAG_MAPPING, *PTAG_INFO_NAME_TAG_MAPPING; 89 | 90 | _Must_inspect_result_ 91 | ULONG 92 | WINAPI 93 | I_QueryTagInformation( 94 | _In_opt_ PCWSTR MachineName, 95 | _In_ TAG_INFO_LEVEL InfoLevel, 96 | _Inout_ PVOID TagInfo 97 | ); 98 | 99 | typedef ULONG (WINAPI *PQUERY_TAG_INFORMATION)( 100 | _In_opt_ PCWSTR MachineName, 101 | _In_ TAG_INFO_LEVEL InfoLevel, 102 | _Inout_ PVOID TagInfo 103 | ); 104 | 105 | #endif 106 | -------------------------------------------------------------------------------- /src/.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | True 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/.rc2: -------------------------------------------------------------------------------- 1 | ///////////////////////////////////////////////////////////////////////////// 2 | // 3 | // RT_MANIFEST 4 | // 5 | LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL 6 | 7 | CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST ".manifest" 8 | 9 | 1 ICON "regedit.ico" 10 | -------------------------------------------------------------------------------- /src/Clone.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbmm/RtlClone/a966a2e3de42025810f5649ed061b7c8e0ae5ad6/src/Clone.rc -------------------------------------------------------------------------------- /src/Clone.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Release 6 | Win32 7 | 8 | 9 | Release 10 | x64 11 | 12 | 13 | 14 | 16.0 15 | Win32Proj 16 | {99b006c0-3a27-3a3c-6588-6c86bd57a80d} 17 | Clone 18 | 10.0 19 | $(SolutionDir)MSBuild\v4.0 20 | 21 | 22 | 23 | Application 24 | false 25 | v143 26 | Unicode 27 | true 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | Level4 37 | true 38 | %(PreprocessorDefinitions) 39 | MaxSpeed 40 | false 41 | $(SolutionDir)pnth 42 | 43 | 44 | Windows 45 | true 46 | true 47 | true 48 | false 49 | ep 50 | comctl32.lib;%(AdditionalDependencies) 51 | /EMITPOGOPHASEINFO /EMITVOLATILEMETADATA:NO %(AdditionalOptions) 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | Create 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /src/Clone.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Source Files 20 | 21 | 22 | Source Files 23 | 24 | 25 | 26 | 27 | Header Files 28 | 29 | 30 | Header Files 31 | 32 | 33 | 34 | 35 | Resource Files 36 | 37 | 38 | -------------------------------------------------------------------------------- /src/Clone.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | -------------------------------------------------------------------------------- /src/FileName.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "resource.h" 3 | 4 | EXTERN_C_START 5 | 6 | NTSYSAPI 7 | NTSTATUS 8 | NTAPI 9 | RtlPrepareForProcessCloning(); 10 | 11 | NTSYSAPI 12 | NTSTATUS 13 | NTAPI 14 | RtlCompleteProcessCloning(_In_ BOOL bCloned); 15 | 16 | EXTERN_C_END 17 | 18 | int ShowErrorBox(HWND hwnd, NTSTATUS status, PCWSTR lpCaption, UINT uType) 19 | { 20 | int r = 0; 21 | 22 | PWSTR lpText; 23 | if (FormatMessageW(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS, 24 | GetModuleHandle(L"ntdll"), status, 0, (PWSTR)&lpText, 0, 0)) 25 | { 26 | r = MessageBoxW(hwnd, lpText, lpCaption, uType); 27 | LocalFree(lpText); 28 | } 29 | 30 | return r; 31 | } 32 | 33 | NTSTATUS CloneUserProcess(_Out_ PHANDLE ProcessHandle, 34 | _Out_ PHANDLE ThreadHandle, 35 | _In_ BOOL bSynchronize, 36 | _In_ ULONG ProcessFlags, // PROCESS_CREATE_FLAGS_* 37 | _In_ ULONG ThreadFlags // THREAD_CREATE_FLAGS_* 38 | ) 39 | { 40 | NTSTATUS status = bSynchronize ? RtlPrepareForProcessCloning() : STATUS_SUCCESS; 41 | 42 | if (0 <= status) 43 | { 44 | PS_CREATE_INFO createInfo = { sizeof(createInfo) }; 45 | 46 | status = NtCreateUserProcess(ProcessHandle, 47 | ThreadHandle, PROCESS_ALL_ACCESS, THREAD_ALL_ACCESS, NULL, NULL, 48 | ProcessFlags, ThreadFlags, NULL, &createInfo, NULL); 49 | 50 | if (IsDebuggerPresent()) __debugbreak(); 51 | 52 | if (bSynchronize) RtlCompleteProcessCloning(STATUS_PROCESS_CLONED == status); 53 | } 54 | 55 | return status; 56 | } 57 | 58 | NTSTATUS OpenSection(_Out_ PHANDLE SectionHandle, _In_ PCWSTR lpLibFileName) 59 | { 60 | int len = 0; 61 | PWSTR buf = 0; 62 | 63 | while (0 < (len = _snwprintf(buf, len, L"\\KnownDlls\\%s", lpLibFileName))) 64 | { 65 | if (buf) 66 | { 67 | UNICODE_STRING ObjectName; 68 | OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, &ObjectName, OBJ_CASE_INSENSITIVE }; 69 | RtlInitUnicodeString(&ObjectName, buf); 70 | 71 | return NtOpenSection(SectionHandle, SECTION_MAP_EXECUTE, &oa); 72 | } 73 | 74 | buf = (PWSTR)alloca(++len * sizeof(WCHAR)); 75 | } 76 | 77 | return STATUS_INTERNAL_ERROR; 78 | } 79 | 80 | NTSTATUS CreateSection(_Out_ PHANDLE SectionHandle, _In_ PCWSTR lpLibFileName) 81 | { 82 | int len = 0; 83 | PWSTR buf = 0; 84 | 85 | while (0 < (len = _snwprintf(buf, len, L"\\systemroot\\system32\\%s", lpLibFileName))) 86 | { 87 | if (buf) 88 | { 89 | UNICODE_STRING ObjectName; 90 | OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, &ObjectName, OBJ_CASE_INSENSITIVE }; 91 | RtlInitUnicodeString(&ObjectName, buf); 92 | 93 | HANDLE hFile; 94 | IO_STATUS_BLOCK iosb; 95 | NTSTATUS status = NtOpenFile(&hFile, FILE_EXECUTE | SYNCHRONIZE, &oa, &iosb, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_NONALERT); 96 | 97 | if (0 <= status) 98 | { 99 | status = NtCreateSection(SectionHandle, SECTION_MAP_EXECUTE, 0, 0, PAGE_EXECUTE, SEC_IMAGE, hFile); 100 | NtClose(hFile); 101 | } 102 | 103 | return status; 104 | } 105 | 106 | buf = (PWSTR)alloca(++len * sizeof(WCHAR)); 107 | } 108 | 109 | return STATUS_INTERNAL_ERROR; 110 | } 111 | 112 | NTSTATUS CreateOrOpenSection(_Out_ PHANDLE SectionHandle, _In_ PCWSTR lpLibFileName) 113 | { 114 | NTSTATUS status = OpenSection(SectionHandle, lpLibFileName); 115 | return 0 > status ? CreateSection(SectionHandle, lpLibFileName) : STATUS_SUCCESS; 116 | } 117 | 118 | struct BAS { 119 | PVOID BaseAddress; 120 | NTSTATUS status; 121 | }; 122 | 123 | void NTAPI OnApc( 124 | _In_opt_ PVOID ApcArgument1, 125 | _In_opt_ PVOID ApcArgument2, 126 | _In_opt_ PVOID ApcArgument3) 127 | { 128 | reinterpret_cast(ApcArgument1)->BaseAddress = ApcArgument2; 129 | reinterpret_cast(ApcArgument1)->status = (NTSTATUS)(ULONG_PTR)ApcArgument3; 130 | } 131 | 132 | NTSTATUS NotifyParent(_In_ HANDLE hThread, _In_ PVOID BaseAddress, _In_ BAS* p, NTSTATUS status) 133 | { 134 | return NtQueueApcThread(hThread, OnApc, p, BaseAddress, (PVOID)(ULONG_PTR)status); 135 | } 136 | 137 | NTSTATUS DoRemoteMap( 138 | _In_ PCWSTR lpLibFileName, 139 | _In_ PCLIENT_ID ClientId, 140 | _In_ HANDLE hThread, 141 | _In_ BAS* p) 142 | { 143 | HANDLE hProcess, hSection; 144 | 145 | BOOL bPost = FALSE; 146 | 147 | NTSTATUS status; 148 | 149 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 150 | 151 | if (0 <= (status = NtOpenProcess(&hProcess, PROCESS_VM_OPERATION, &oa, ClientId))) 152 | { 153 | if (0 <= (status = CreateOrOpenSection(&hSection, lpLibFileName))) 154 | { 155 | SIZE_T ViewSize = 0; 156 | PVOID BaseAddress = 0; 157 | 158 | ////////////////////////////////////////////////////////////////////////// 159 | // 160 | // ERROR: Unable to find system process **** 161 | // ERROR: The process being debugged has either exited or cannot be accessed 162 | // ERROR: Many commands will not work properly 163 | // ERROR: Module load event for unknown process 164 | // 165 | ////////////////////////////////////////////////////////////////////////// 166 | 167 | status = ZwMapViewOfSection(hSection, hProcess, &BaseAddress, 168 | 0, 0, 0, &ViewSize, ViewShare, 0, PAGE_EXECUTE); 169 | 170 | NtClose(hSection); 171 | 172 | if (0 <= status) 173 | { 174 | bPost = TRUE; 175 | 176 | if (0 > (status = NotifyParent(hThread, BaseAddress, p, status))) 177 | { 178 | ZwUnmapViewOfSection(hProcess, BaseAddress); 179 | } 180 | } 181 | } 182 | 183 | NtClose(hProcess); 184 | } 185 | 186 | if (!bPost) NotifyParent(hThread, 0, p, status); 187 | 188 | return status; 189 | } 190 | 191 | NTSTATUS DoRemoteUnMap( 192 | _In_ PVOID BaseAddress, 193 | _In_ PCLIENT_ID ClientId, 194 | _In_ HANDLE hThread, 195 | _In_ BAS* p) 196 | { 197 | HANDLE hProcess; 198 | 199 | NTSTATUS status; 200 | 201 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 202 | 203 | if (0 <= (status = NtOpenProcess(&hProcess, PROCESS_VM_OPERATION, &oa, ClientId))) 204 | { 205 | status = ZwUnmapViewOfSection(hProcess, BaseAddress); 206 | 207 | NtClose(hProcess); 208 | } 209 | 210 | NotifyParent(hThread, BaseAddress, p, status); 211 | 212 | return status; 213 | } 214 | 215 | NTSTATUS OpenParentThread(_Out_ PHANDLE ThreadHandle, 216 | _In_ ACCESS_MASK DesiredAccess, 217 | _In_ PCLIENT_ID ClientId) 218 | /* 219 | thread with ClientId must be created *before* current thread 220 | */ 221 | { 222 | NTSTATUS status; 223 | KERNEL_USER_TIMES kut, my_kut; 224 | 225 | if (0 <= (status = NtQueryInformationThread(NtCurrentThread(), ThreadTimes, &my_kut, sizeof(my_kut), 0))) 226 | { 227 | HANDLE hThread; 228 | OBJECT_ATTRIBUTES oa = { sizeof(oa) }; 229 | 230 | if (0 <= (status = NtOpenThread(&hThread, DesiredAccess|THREAD_QUERY_LIMITED_INFORMATION, &oa, ClientId))) 231 | { 232 | if (0 <= (status = NtQueryInformationThread(hThread, ThreadTimes, &kut, sizeof(kut), 0))) 233 | { 234 | if (kut.CreateTime.QuadPart <= my_kut.CreateTime.QuadPart) 235 | { 236 | *ThreadHandle = hThread; 237 | return STATUS_SUCCESS; 238 | } 239 | 240 | // original thread terminated and other thread reuse it id 241 | status = STATUS_INVALID_CID; 242 | } 243 | 244 | NtClose(hThread); 245 | } 246 | } 247 | 248 | return status; 249 | } 250 | 251 | NTSTATUS fork(_In_ HWND hwnd, _In_ PCWSTR lpLibFileName = 0, _In_ PVOID BaseAddress = 0, _In_ int index = -1) 252 | { 253 | HANDLE hProcess, hThread; 254 | 255 | BAS ba { 0, STATUS_UNSUCCESSFUL }; 256 | 257 | CLIENT_ID cid = { (HANDLE)(ULONG_PTR)GetCurrentProcessId(), (HANDLE)(ULONG_PTR)GetCurrentThreadId() }; 258 | 259 | NTSTATUS status = CloneUserProcess(&hProcess, &hThread, TRUE, 0, 0); 260 | 261 | if (STATUS_PROCESS_CLONED == status) 262 | { 263 | // ++ cloned process 264 | 265 | if (0 <= (status = OpenParentThread(&hThread, THREAD_ALERT|THREAD_SET_CONTEXT, &cid))) 266 | { 267 | status = BaseAddress ? DoRemoteUnMap(BaseAddress, &cid, hThread, &ba) : 268 | lpLibFileName ? DoRemoteMap(lpLibFileName, &cid, hThread, &ba) : NtAlertThread(hThread); 269 | 270 | NtClose(hThread); 271 | } 272 | 273 | NtTerminateProcess(NtCurrentProcess(), status); 274 | 275 | // -- cloned process 276 | } 277 | 278 | if (0 <= status) 279 | { 280 | NtClose(hThread); 281 | 282 | status = NtWaitForSingleObject(hProcess, TRUE, 0); 283 | 284 | NtClose(hProcess); 285 | 286 | if (STATUS_USER_APC == status) 287 | { 288 | if (0 > ba.status) 289 | { 290 | ShowErrorBox(hwnd, ba.status, lpLibFileName, MB_ICONHAND); 291 | } 292 | else 293 | { 294 | WCHAR msg[0x40]; 295 | HWND hwndCB = GetDlgItem(hwnd, IDC_COMBO1); 296 | 297 | if (BaseAddress) 298 | { 299 | if (0 <= (index = ComboBox_DeleteString(hwndCB, index))) 300 | { 301 | ComboBox_SetCurSel(hwndCB, index - 1); 302 | 303 | if (!index) 304 | { 305 | EnableWindow(GetDlgItem(hwnd, IDC_BUTTON4), FALSE); 306 | } 307 | } 308 | swprintf_s(msg, _countof(msg), L"unload at %p", BaseAddress); 309 | } 310 | else if (lpLibFileName) 311 | { 312 | swprintf_s(msg, _countof(msg), L"mapped at %p", ba.BaseAddress); 313 | 314 | if (0 <= (index = ComboBox_AddString(hwndCB, msg + _countof("mapped at")))) 315 | { 316 | ComboBox_SetItemData(hwndCB, index, ba.BaseAddress); 317 | ComboBox_SetCurSel(hwndCB, index); 318 | 319 | if (!index) EnableWindow(GetDlgItem(hwnd, IDC_BUTTON4), TRUE); 320 | } 321 | } 322 | MessageBoxW(hwnd, msg, lpLibFileName, MB_ICONINFORMATION); 323 | } 324 | } 325 | } 326 | 327 | return status; 328 | } 329 | 330 | NTSTATUS fork() 331 | { 332 | HANDLE hProcess, hThread, hEvent; 333 | 334 | OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, 0, OBJ_INHERIT }; 335 | 336 | NTSTATUS status = NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &oa, NotificationEvent, FALSE); 337 | 338 | if (0 <= status) 339 | { 340 | status = CloneUserProcess(&hProcess, &hThread, TRUE, PROCESS_CREATE_FLAGS_INHERIT_HANDLES, 0); 341 | 342 | if (STATUS_PROCESS_CLONED == status) 343 | { 344 | // ++ cloned process 345 | status = NtSetEvent(hEvent, 0); 346 | NtClose(hEvent); 347 | NtTerminateProcess(NtCurrentProcess(), status); 348 | // -- cloned process 349 | } 350 | 351 | if (0 <= status) 352 | { 353 | NtClose(hThread); 354 | 355 | HANDLE Handles[2] = { hProcess, hEvent }; 356 | // really possible raise, if NtTerminateProcess will be called before NtWaitForMultipleObjects 357 | // will be STATUS_WAIT_0 instead STATUS_WAIT_1 (both hEvent and hProcess is signaled) 358 | status = NtWaitForMultipleObjects(_countof(Handles), Handles, WaitAny, TRUE, 0); 359 | 360 | NtClose(hProcess); 361 | } 362 | 363 | NtClose(hEvent); 364 | } 365 | 366 | return status; 367 | } 368 | 369 | NTSTATUS OnCmd(HWND hwnd, WPARAM wParam, LPARAM lParam) 370 | { 371 | switch (wParam) 372 | { 373 | case MAKEWPARAM(IDC_BUTTON1, BN_CLICKED): 374 | return fork(); 375 | 376 | case MAKEWPARAM(IDC_BUTTON2, BN_CLICKED): 377 | return fork(0); 378 | 379 | case MAKEWPARAM(IDC_BUTTON3, BN_CLICKED): 380 | lParam = (LPARAM)alloca(0x100*sizeof(WCHAR)); 381 | if (GetDlgItemTextW(hwnd, IDC_EDIT1, (PWSTR)lParam, 0x100)) 382 | { 383 | return fork(hwnd, (PWSTR)lParam); 384 | } 385 | break; 386 | 387 | case MAKEWPARAM(IDC_BUTTON4, BN_CLICKED): 388 | if (0 <= (lParam = ComboBox_GetCurSel(GetDlgItem(hwnd, IDC_COMBO1)))) 389 | { 390 | fork(hwnd, 0, (PVOID)ComboBox_GetItemData(GetDlgItem(hwnd, IDC_COMBO1), lParam), (int)lParam); 391 | } 392 | break; 393 | 394 | case IDCANCEL: 395 | EndDialog(hwnd, 0); 396 | break; 397 | 398 | case MAKEWPARAM(IDC_EDIT1, EN_CHANGE): 399 | EnableWindow(GetDlgItem(hwnd, IDC_BUTTON3), GetWindowTextLengthW((HWND)lParam)); 400 | break; 401 | 402 | case MAKEWPARAM(IDC_COMBO1, CBN_SELCHANGE): 403 | EnableWindow(GetDlgItem(hwnd, IDC_BUTTON4), 0 <= ComboBox_GetCurSel((HWND)lParam)); 404 | break; 405 | } 406 | 407 | return STATUS_MORE_PROCESSING_REQUIRED; 408 | } 409 | 410 | INT_PTR CALLBACK DlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 411 | { 412 | switch (uMsg) 413 | { 414 | case WM_COMMAND: 415 | switch (NTSTATUS status = OnCmd(hwnd, wParam, lParam)) 416 | { 417 | case STATUS_MORE_PROCESSING_REQUIRED: 418 | break; 419 | default: 420 | ShowErrorBox(hwnd, status, L"Result:", MB_ICONINFORMATION); 421 | } 422 | break; 423 | 424 | case WM_INITDIALOG: 425 | SendDlgItemMessageW(hwnd, IDC_EDIT1, EM_SETCUEBANNER, TRUE, (LPARAM)L"enter from %windir%\\system32"); 426 | break; 427 | } 428 | 429 | return 0; 430 | } 431 | 432 | void WINAPI ep(void* ) 433 | { 434 | ExitProcess((UINT)DialogBoxParamW((HINSTANCE)&__ImageBase, MAKEINTRESOURCE(IDD_DIALOG1), 0, DlgProc, 0)); 435 | } -------------------------------------------------------------------------------- /src/regedit.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbmm/RtlClone/a966a2e3de42025810f5649ed061b7c8e0ae5ad6/src/regedit.ico -------------------------------------------------------------------------------- /src/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by Clone.rc 4 | // 5 | #define VS_VERSION_INFO 1 6 | #define IDD_DIALOG1 101 7 | #define IDC_BUTTON1 1001 8 | #define IDC_BUTTON2 1002 9 | #define IDC_BUTTON3 1003 10 | #define IDC_BUTTON4 1005 11 | #define IDC_EDIT1 1004 12 | #define IDC_COMBO1 1006 13 | 14 | // Next default values for new objects 15 | // 16 | #ifdef APSTUDIO_INVOKED 17 | #ifndef APSTUDIO_READONLY_SYMBOLS 18 | #define _APS_NEXT_RESOURCE_VALUE 103 19 | #define _APS_NEXT_COMMAND_VALUE 40001 20 | #define _APS_NEXT_CONTROL_VALUE 1007 21 | #define _APS_NEXT_SYMED_VALUE 101 22 | #endif 23 | #endif 24 | -------------------------------------------------------------------------------- /src/stdafx.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | 3 | void* __cdecl operator new[](size_t ByteSize) 4 | { 5 | return HeapAlloc(GetProcessHeap(), 0, ByteSize); 6 | } 7 | 8 | void* __cdecl operator new(size_t ByteSize) 9 | { 10 | return HeapAlloc(GetProcessHeap(), 0, ByteSize); 11 | } 12 | 13 | void __cdecl operator delete(void* Buffer) 14 | { 15 | HeapFree(GetProcessHeap(), 0, Buffer); 16 | } 17 | 18 | void __cdecl operator delete(void* Buffer, size_t) 19 | { 20 | HeapFree(GetProcessHeap(), 0, Buffer); 21 | } 22 | 23 | void __cdecl operator delete[](void* Buffer) 24 | { 25 | HeapFree(GetProcessHeap(), 0, Buffer); 26 | } 27 | 28 | void __cdecl operator delete[](void* Buffer, size_t) 29 | { 30 | HeapFree(GetProcessHeap(), 0, Buffer); 31 | } -------------------------------------------------------------------------------- /src/stdafx.h: -------------------------------------------------------------------------------- 1 | #define DECLSPEC_DEPRECATED_DDK 2 | 3 | #define _CRT_SECURE_NO_DEPRECATE 4 | #define _CRT_NON_CONFORMING_SWPRINTFS 5 | #define _NO_CRT_STDIO_INLINE 6 | #define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 0 7 | #define _ALLOW_COMPILER_AND_STL_VERSION_MISMATCH 8 | #define __EDG__ 9 | #define USE_ATL_THUNK2 10 | 11 | #define _CRTIMP_ALT __declspec(dllimport) 12 | 13 | #define CMSG_SIGNED_ENCODE_INFO_HAS_CMS_FIELDS 14 | #define CMSG_SIGNER_ENCODE_INFO_HAS_CMS_FIELDS 15 | #define CRYPT_OID_INFO_HAS_EXTRA_FIELDS 16 | 17 | #pragma warning(disable : 4073 4074 4075 4097 4514 4005 4200 4201 4238 4307 4324 4392 4480 4530 4706 5040) 18 | #include 19 | //#include 20 | #include 21 | #include 22 | 23 | #include 24 | #include 25 | #include 26 | #undef WIN32_NO_STATUS 27 | #include 28 | #include 29 | #include 30 | 31 | //#include 32 | //#include 33 | 34 | EXTERN_C IMAGE_DOS_HEADER __ImageBase; 35 | 36 | #ifndef PHNT_MODE 37 | #define PHNT_MODE PHNT_MODE_USER 38 | #endif 39 | 40 | #ifndef PHNT_VERSION 41 | #define PHNT_VERSION PHNT_WIN11_22H2 42 | #endif 43 | 44 | #define _NTLSA_ 45 | 46 | #if PHNT_MODE == PHNT_MODE_USER 47 | #define SECURITY_WIN32 48 | #endif 49 | 50 | #pragma warning(disable : 4073 4074 4075 4097 4514 4005 4200 4201 4238 4307 4324 4471 4480 4530 4706 5040) 51 | 52 | typedef GUID* PGUID; 53 | 54 | #define PHNT_NO_INLINE_INIT_STRING 55 | #include "phnt.h" 56 | 57 | #pragma warning(default : 4392) -------------------------------------------------------------------------------- /x64/Release/Clone.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbmm/RtlClone/a966a2e3de42025810f5649ed061b7c8e0ae5ad6/x64/Release/Clone.exe -------------------------------------------------------------------------------- /x64/Release/SkipPsNotify.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rbmm/RtlClone/a966a2e3de42025810f5649ed061b7c8e0ae5ad6/x64/Release/SkipPsNotify.exe --------------------------------------------------------------------------------