Please, give us output of this program from Windows 7 32-bit.#define WIN32_LEAN_AND_MEAN
#include <windows.h>
int printf(const char * restrict format, ...);
typedef struct _SERVERINFO {
#ifdef _WIN64
DWORD64 dwSRVIFlags;
#else
DWORD dwSRVIFlags;
#endif
ULONG cHandleEntries;
// incomplete
} SERVERINFO, *PSERVERINFO;
typedef struct _SHAREDINFO {
// PVOID psi;
PSERVERINFO psi;
PVOID aheList;
ULONG HeEntrySize;
// incomplete
} SHAREDINFO, *PSHAREDINFO;
int main(void)
{
SHAREDINFO *pSharedInfo = (SHAREDINFO *)GetProcAddress(LoadLibraryA("user32"), "gSharedInfo");
printf("\nSharedInfo %ph\n", pSharedInfo);
printf("SharedInfo->psi->cHandleEntries %u\n", pSharedInfo->psi->cHandleEntries);
printf("SharedInfo->aheList %ph\n", pSharedInfo->aheList);
printf("SharedInfo->HeEntrySize %Xh\n", pSharedInfo->HeEntrySize);
// more test
ULONG ul;
#ifndef _WIN64
if (*(ULONG*)(((BYTE*)pSharedInfo)+8) == 18) {
ul = *(ULONG*)(((BYTE*)pSharedInfo->psi)+4); // OK
printf("cHandleEntries %u\n", ul);
ul = *(ULONG*)(*((BYTE**)pSharedInfo)+4); // another way
printf("cHandleEntries %u\n", ul);
printf("aheList %ph\n", *(ULONG*)(((BYTE*)pSharedInfo)+4));
} else
#endif
if (*(ULONG*)(((BYTE*)pSharedInfo)+16) == 24) { // win64 / win32 WOW64 Win 7 ->
ul = *(ULONG*)(((BYTE*)pSharedInfo->psi)+8); // OK
printf("cHandleEntries %u\n", ul);
ul = *(ULONG*)(*((BYTE**)pSharedInfo)+8); // another way
printf("cHandleEntries %u\n", ul);
printf("aheList %ph\n", *(ULONG*)(((BYTE*)pSharedInfo)+8));
}
return 0;
}
EDIT: fix 32-bit test