--- D:\dev\ThirdParty\sourceforge.net\nsis\plugins\LockedList\2.6.1.4\Contrib\LockedList\SystemEnum.cpp 2013-09-26 00:26:08.000000000 +0600 +++ D:\dev\ThirdParty\sourceforge.net\nsis\plugins\LockedList\2.6.1.4_mod\Contrib\LockedList\SystemEnum.cpp 2013-11-27 00:19:02.000000000 +0600 @@ -88,12 +88,13 @@ #undef _WIN32_WINNT #endif #define _WIN32_WINNT 0x0400 #include #include +#include #include "SystemEnum.h" typedef NTSTATUS (WINAPI* PNtQueryObject)(HANDLE, DWORD, VOID*, DWORD, VOID*); typedef NTSTATUS (WINAPI* PNtQuerySystemInformation)(DWORD, VOID*, DWORD, ULONG*); typedef NTSTATUS (WINAPI* PNtQueryInformationFile)(HANDLE, PVOID, PVOID, DWORD, DWORD); typedef BOOL (WINAPI* PEnumProcesses)(DWORD*, DWORD, DWORD*); @@ -552,34 +553,48 @@ return TRUE; } static SYSTEM_HANDLE_INFORMATION* GetSystemHandleInformation() { DWORD size = 0; + DWORD max_size = 16777216; SYSTEM_HANDLE_INFORMATION* pSysHandleInformation; if (!SystemFuncInit()) return NULL; // Find the size to allocate. pSysHandleInformation = (SYSTEM_HANDLE_INFORMATION*)GlobalAlloc(GPTR, sizeof(SYSTEM_HANDLE_INFORMATION)); if (pSysHandleInformation == NULL) return NULL; NtQuerySystemInformation(SystemHandleInformation, pSysHandleInformation, sizeof(SYSTEM_HANDLE_INFORMATION), &size); GlobalFree(pSysHandleInformation); - // Allocate required memory. - pSysHandleInformation = (SYSTEM_HANDLE_INFORMATION*)GlobalAlloc(GPTR, size); - if (pSysHandleInformation == NULL) - return NULL; + while(size < max_size) + { + // Allocate required memory. + pSysHandleInformation = (SYSTEM_HANDLE_INFORMATION*)GlobalAlloc(GPTR, size); + if (pSysHandleInformation == NULL) + return NULL; - // Query the objects (system wide). - if (!NT_SUCCESS(NtQuerySystemInformation(SystemHandleInformation, pSysHandleInformation, size, NULL))) - { - GlobalFree(pSysHandleInformation); - return NULL; + // Query the objects (system wide). + NTSTATUS res = NtQuerySystemInformation(SystemHandleInformation, pSysHandleInformation, size, NULL); + if (NT_SUCCESS(res)) + break; + else + { + GlobalFree(pSysHandleInformation); + pSysHandleInformation = NULL; + + if (res != STATUS_INFO_LENGTH_MISMATCH) + { + break; + } + + size *= 2; + } } return pSysHandleInformation; } // Get the process image file name.