/* * WinObjInitGlobals * * Purpose: * * Initialize global variables. * */ BOOL WinObjInitGlobals() { SIZE_T cch; BOOL bResult = FALSE, bCond = FALSE; do { RtlSecureZeroMemory(&g_WinObj, sizeof(g_WinObj)); // // Query version info. // g_WinObj.osver.dwOSVersionInfoSize = sizeof(g_WinObj.osver); RtlGetVersion(&g_WinObj.osver); // // Remember hInstance. // g_WinObj.hInstance = GetModuleHandle(NULL); // // Create dedicated heap. // g_WinObj.Heap = RtlCreateHeap(HEAP_GROWABLE, NULL, 0, 0, NULL, NULL); if (g_WinObj.Heap == NULL) break; RtlSetHeapInformation(g_WinObj.Heap, HeapEnableTerminationOnCorruption, NULL, 0); RtlInitializeCriticalSection(&g_WinObj.Lock); // // Remember %TEMP% directory. // cch = ExpandEnvironmentStrings(L"%temp%", g_WinObj.szTempDirectory, MAX_PATH); if ((cch == 0) || (cch > MAX_PATH)) break; // // Remember Windows directory. // if (!GetWindowsDirectory(g_WinObj.szWindowsDirectory, MAX_PATH)) break; // // Remember System32 directory. // if (!GetSystemDirectory(g_WinObj.szSystemDirectory, MAX_PATH)) break; bResult = TRUE; } while (bCond); if (bResult == FALSE) { if (g_WinObj.Heap) RtlDestroyHeap(g_WinObj.Heap); } return bResult; }
BOOL WINAPI HeapSetInformation( HANDLE heap, HEAP_INFORMATION_CLASS infoclass, PVOID info, SIZE_T size) { NTSTATUS ret = RtlSetHeapInformation( heap, infoclass, info, size ); if (ret) SetLastError( RtlNtStatusToDosError(ret) ); return !ret; }