#include #include #include #include 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; } }