36#if !defined PROCESSINFOCLASS
37 typedef LONG PROCESSINFOCLASS;
40 NTSTATUS(WINAPI *_ZwQueryInformationProcess)(
41 IN HANDLE ProcessHandle,
42 IN PROCESSINFOCLASS ProcessInformationClass,
43 OUT PVOID ProcessInformation,
44 IN ULONG ProcessInformationLength,
45 OUT PULONG ReturnLength
53 FARPROC procPtr = GetProcAddress(hNtDll,
"ZwQueryInformationProcess");
58 _ZwQueryInformationProcess = (NTSTATUS(WINAPI *)(
66 typedef struct _PROCESS_BASIC_INFORMATION {
70 ULONG_PTR UniqueProcessId;
72 } PROCESS_BASIC_INFORMATION;
74 PROCESS_BASIC_INFORMATION pbi = { 0 };
75 if (_ZwQueryInformationProcess(hProcess, 0, &pbi,
sizeof(PROCESS_BASIC_INFORMATION), NULL) == S_OK) {
76 const DWORD pid =
static_cast<DWORD
>(pbi.UniqueProcessId);
118 if (!areaSize)
return false;
120 const DWORD dwForbiddenArea = PAGE_GUARD | PAGE_NOACCESS;
122 MEMORY_BASIC_INFORMATION mbi = { 0 };
123 const size_t mbiSize =
sizeof(MEMORY_BASIC_INFORMATION);
125 SIZE_T sizeToCheck = areaSize;
126 LPCVOID areaPtr = areaStart;
128 while (sizeToCheck > 0) {
130 memset(&mbi, 0, mbiSize);
133 if (VirtualQuery(areaPtr, &mbi, mbiSize) != mbiSize) {
137 bool isOk = (mbi.State & MEM_COMMIT)
138 && !(mbi.Protect & dwForbiddenArea)
139 && (mbi.Protect & dwAccessRights);
143 SIZE_T offset = (ULONG_PTR)areaPtr - (ULONG_PTR)mbi.BaseAddress;
144 SIZE_T queriedSize = mbi.RegionSize - offset;
145 if (queriedSize >= sizeToCheck) {
149 sizeToCheck -= queriedSize;
150 areaPtr = LPCVOID((ULONG_PTR)areaPtr + queriedSize);
159 return (IsBadReadPtr(areaStart, areaSize)) ? true :
false;
161 const DWORD dwReadRights = PAGE_READONLY | PAGE_READWRITE | PAGE_WRITECOPY | PAGE_EXECUTE_READ | PAGE_EXECUTE_READWRITE | PAGE_EXECUTE_WRITECOPY;