#include <windows.h>
#include <malloc.h>
#include <stdio.h>
#include <tchar.h>
extern "C"
{
typedef BOOL (WINAPI *LPFN_GLPI)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION,PDWORD);
__declspec(dllexport) int getCoreCount(){
LPFN_GLPI glpi;
BOOL done = FALSE;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL;
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = NULL;
DWORD returnLength = 0;
DWORD processorCoreCount = 0;
DWORD byteOffset = 0;
HINSTANCE hDll;
hDll=LoadLibrary("kernel32.dll");
if (hDll==NULL) {
printf("ERROR!!!\n");
return(1);
}
glpi = (LPFN_GLPI) GetProcAddress(hDll,"GetLogicalProcessorInformation");
if (NULL == glpi) {
printf("\nGetLogicalProcessorInformation is not supported.\n");
return (1);
}
while (!done) {
DWORD rc = glpi(buffer, &returnLength);
if (FALSE == rc) {
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
if (buffer)
free(buffer);
buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(
returnLength);
if (NULL == buffer) {
printf("\nError: Allocation failure\n");
return (2);
}
} else {
printf("\nError %d\n", GetLastError());
return (3);
}
} else {
done = TRUE;
}
}
ptr = buffer;
while (byteOffset + sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION) <= returnLength) {
if (ptr->Relationship == RelationProcessorCore) {
processorCoreCount++;
}
byteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION);
ptr++;
}
/*
printf("Number of processor cores: %d\n",
processorCoreCount);
*/
free(buffer);
FreeLibrary(hDll);
return processorCoreCount;
}
}
Comments
0 B
|0 👍
/0 👎
0 B
|👍
/👎