如何修复SYSTEM_PROCESS_INFORMATION错误

时间:2014-04-14 14:29:17

标签: c++

帮我修复此错误

#include <Windows.h> 
#include <stdio.h> 
#include <Psapi.h> 
td_NtQuerySystemInformation    NtQuerySystemInformation    = NULL; 
 td_NtQueryObject            NtQueryObject                = NULL; 
  td_NtDuplicateObject        NtDuplicateObject            = NULL; 

BOOL Init() { 
HMODULE hNtdll = GetModuleHandle(TEXT("ntdll.dll")); 
if(!hNtdll) 
    return FALSE; 

NtQuerySystemInformation    = (td_NtQuerySystemInformation)GetProcAddress(hNtdll, "NtQuerySystemInformation"); 
NtQueryObject                = (td_NtQueryObject)GetProcAddress(hNtdll, "NtQueryObject"); 
NtDuplicateObject            = (td_NtDuplicateObject)GetProcAddress(hNtdll, "NtDuplicateObject"); 

return (NtQuerySystemInformation && NtQueryObject && NtDuplicateObject); 
} 

BOOL AcquireDebugPrivilege() { 
HANDLE hToken = NULL; 
if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
    return FALSE; 

BOOL bSuccess = FALSE; 

TOKEN_PRIVILEGES tp; 
tp.PrivilegeCount = 1; 
if(LookupPrivilegeValue(0, SE_DEBUG_NAME, &tp.Privileges[0].Luid)) { 
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    if(AdjustTokenPrivileges(hToken, 0, &tp, sizeof(tp), 0, 0)) 
        bSuccess = TRUE; 
} 

CloseHandle(hToken); 

return bSuccess; 
 } 



 BOOL IsProcessFound(DWORD dwProcessId, PSYSTEM_PROCESS_INFORMATION pInfos) { 
PSYSTEM_PROCESS_INFORMATION pCurrent = pInfos; 

while(TRUE) { 
    if((DWORD)pCurrent->UniqueProcessId == dwProcessId) 
        return TRUE; 

    if(pCurrent->NextEntryOffset == 0) 
        break; 
    pCurrent = (PSYSTEM_PROCESS_INFORMATION)((DWORD_PTR)pCurrent + pCurrent-           >NextEntryOffset); 
} 

return FALSE; 
} 

   BOOL DetectHiddenProcesses(PUINT piCount) { 
if(!piCount) 
    return FALSE; 
*piCount = 0; 

// first, we retrieve the process list (this is dirty but the only way) 
DWORD dwLen = sizeof(SYSTEM_PROCESS_INFORMATION); 
PSYSTEM_PROCESS_INFORMATION pProcessInfos = (PSYSTEM_PROCESS_INFORMATION)malloc(dwLen); 

while(pProcessInfos) { 
    NTSTATUS status = NtQuerySystemInformation(SystemProcessInformation, pProcessInfos, dwLen, &dwLen); 
    if(NT_SUCCESS(status)) 
        break; 
    else if(status != STATUS_INFO_LENGTH_MISMATCH) { 
        free(pProcessInfos); 
        return FALSE; 
    } 

    free(pProcessInfos); 
    pProcessInfos = (PSYSTEM_PROCESS_INFORMATION)malloc(dwLen); 
} 

if(!pProcessInfos) 
    return FALSE; 

// secondly, we retreive all open handle 
dwLen = sizeof(SYSTEM_HANDLE_INFORMATION); 
PSYSTEM_HANDLE_INFORMATION pHandleInfos = (PSYSTEM_HANDLE_INFORMATION)malloc(dwLen); 

while(pHandleInfos) { 
    NTSTATUS status = NtQuerySystemInformation(SystemHandleInformation, pHandleInfos, dwLen, &dwLen); 
    if(NT_SUCCESS(status)) 
        break; 
    else if(status != STATUS_INFO_LENGTH_MISMATCH) { 
        free(pHandleInfos); 
        return FALSE; 
    } 

    free(pHandleInfos); 
    pHandleInfos = (PSYSTEM_HANDLE_INFORMATION)malloc(dwLen); 
} 

if(!pHandleInfos) 
    return FALSE; 

// now, we find all handle to a process 
POBJECT_TYPE_INFORMATION pType = (POBJECT_TYPE_INFORMATION)malloc(4096); 
if(!pType) { 
    free(pHandleInfos); 
    free(pProcessInfos); 
    return FALSE; 
} 

for(ULONG i = 0; i < pHandleInfos->HandleCount; i++) { 
    DWORD dwOwner = pHandleInfos->Handles[i].ProcessId; 
    HANDLE hHandle = (HANDLE)pHandleInfos->Handles[i].Handle; 

    HANDLE hOwner = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwOwner); 
    if(hOwner == NULL) 
        continue; 

    // we duplicate the handle so we can query it 
    HANDLE hHandleLocal = NULL; 
    NTSTATUS status = NtDuplicateObject(hOwner, hHandle, GetCurrentProcess(), &hHandleLocal, 0, 0, DUPLICATE_SAME_ACCESS | DUPLICATE_SAME_ATTRIBUTES); 
    if(NT_SUCCESS(status)) { 
        // now we query its type 
        status = NtQueryObject(hHandleLocal, ObjectTypeInformation, pType, 4096, NULL); 
        if(NT_SUCCESS(status)) { 
            if(pType->TypeName.Buffer && wcscmp(pType->TypeName.Buffer, L"Process") == 0) { 
                DWORD dwProcessId = GetProcessId(hHandleLocal); 
                // check if the process is not hidden 
                if(!IsProcessFound(dwProcessId, pProcessInfos)) { 
                    // hoho here we go 
                    wchar_t szProcess[MAX_PATH]; 
                    if(GetProcessImageFileNameW(hHandleLocal, szProcess, MAX_PATH) == 0) 
                        wcscpy_s(szProcess, L"<Unknown>"); 
                    printf("[%0.4d] %ws\n", dwProcessId, szProcess); 

                    (*piCount)++; 
                } 
            } 
        } 
    } 

    CloseHandle(hOwner); 
} 
free(pType); 

free(pHandleInfos); 
free(pProcessInfos); 

return TRUE; 
} 

int main(int argc, char* argv[]) { 
UINT iHiddenCount = 0; 

if(!AcquireDebugPrivilege()) { 
    printf("Unable to acquire debug privilege.\n"); 
    return EXIT_FAILURE; 
} 

if(!Init()) { 
    printf("Initialization failure.\r\n"); 
    return EXIT_FAILURE; 
} 

DetectHiddenProcesses(&iHiddenCount); 

printf("Found %d hidden process%s.\r\n", iHiddenCount, (iHiddenCount > 1 ? "es" : "")); 
return EXIT_SUCCESS; 

}

代码

1>------ Build started: Project: mand, Configuration: Release Win32 ------
1>  Main.cpp
1>Main.cpp(5): error C2146: syntax error : missing ';' before identifier      'NtQuerySystemInformation'
 1>Main.cpp(5): error C4430: missing type specifier - int assumed. Note: C++ does not  support default-int
  1>Main.cpp(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
  1>Main.cpp(6): error C2146: syntax error : missing ';' before identifier 'NtQueryObject'
 1>Main.cpp(6): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
   1>Main.cpp(6): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
     1>Main.cpp(7): error C2146: syntax error : missing ';' before identifier 'NtDuplicateObject'
       1>Main.cpp(7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
   1>Main.cpp(7): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
       1>Main.cpp(14): error C2146: syntax error : missing ';' before identifier           1>Main.cpp(15): error C2146: syntax error : missing ';' before identifier 'GetProcAddress'
        1>Main.cpp(16): error C2146: syntax error : missing ';' before identifier 'GetProcAddress'
      1>Main.cpp(41): error C2061: syntax error : identifier 'PSYSTEM_PROCESS_INFORMATION'
    1>Main.cpp(42): error C2065: 'PSYSTEM_PROCESS_INFORMATION' : undeclared identifier
    1>Main.cpp(42): error C2146: syntax error : missing ';' before identifier 'pCurrent'
  1>Main.cpp(42): error C2065: 'pCurrent' : undeclared identifier
  1>Main.cpp(42): error C2065: 'pInfos' : undeclared identifier
   1>Main.cpp(45): error C2065: 'pCurrent' : undeclared identifier
   1>Main.cpp(45): error C2227: left of '->UniqueProcessId' must point to      class/struct/union/generic type
  1>          type is ''unknown-type''
    1>Main.cpp(48): error C2065: 'pCurrent' : undeclared identifier
  1>Main.cpp(48): error C2227: left of '->NextEntryOffset' must point to class/struct/union/generic type
  1>          type is ''unknown-type''
   1>Main.cpp(50): error C2065: 'pCurrent' : undeclared identifier
    1>Main.cpp(50): error C2065: 'PSYSTEM_PROCESS_INFORMATION' : undeclared identifier
  1>Main.cpp(50): error C2065: 'pCurrent' : undeclared identifier
  1>Main.cpp(50): error C2065: 'pCurrent' : undeclared identifier
 1>Main.cpp(50): error C2227: left of '->NextEntryOffset' must point to class/struct/union/generic type
 1>          type is ''unknown-type''
1>Main.cpp(62): error C2065: 'SYSTEM_PROCESS_INFORMATION' : undeclared identifier
   1>Main.cpp(62): error C2070: ''unknown-type'': illegal sizeof operand
   1>Main.cpp(63): error C2065: 'PSYSTEM_PROCESS_INFORMATION' : undeclared identifier
  1>Main.cpp(63): error C2146: syntax error : missing ';' before identifier   'pProcessInfos'
   1>Main.cpp(63): error C2065: 'pProcessInfos' : undeclared identifier
   1>Main.cpp(63): error C2065: 'PSYSTEM_PROCESS_INFORMATION' : undeclared identifier
  1>Main.cpp(63): error C2146: syntax error : missing ';' before identifier 'malloc'
      1>Main.cpp(65): error C2065: 'pProcessInfos' : undeclared identifier
    1>Main.cpp(66): error C2065: 'SystemProcessInformation' : undeclared identifier
    1>Main.cpp(66): error C2065: 'pProcessInfos' : undeclared identifier
    1>Main.cpp(67): error C3861: 'NT_SUCCESS': identifier not found
   1>Main.cpp(69): error C2065: 'STATUS_INFO_LENGTH_MISMATCH' : undeclared identifier
  1>Main.cpp(70): error C2065: 'pProcessInfos' : undeclared identifier
    1>Main.cpp(74): error C2065: 'pProcessInfos' : undeclared identifier
   1>Main.cpp(75): error C2065: 'pProcessInfos' : undeclared identifier
   1>Main.cpp(75): error C2065: 'PSYSTEM_PROCESS_INFORMATION' : undeclared identifier
  1>Main.cpp(75): error C2146: syntax error : missing ';' before identifier 'malloc'
   1>Main.cpp(78): error C2065: 'pProcessInfos' : undeclared identifier
     1>Main.cpp(82): error C2065: 'SYSTEM_HANDLE_INFORMATION' : undeclared identifier
     1>Main.cpp(82): error C2070: ''unknown-type'': illegal sizeof operand
    1>Main.cpp(83): error C2065: 'PSYSTEM_HANDLE_INFORMATION' : undeclared identifier
    1>Main.cpp(83): error C2146: syntax error : missing ';' before identifier   'pHandleInfos'
   1>Main.cpp(83): error C2065: 'pHandleInfos' : undeclared identifier
   1>Main.cpp(83): error C2065: 'PSYSTEM_HANDLE_INFORMATION' : undeclared identifier
      1>Main.cpp(83): error C2146: syntax error : missing ';' before identifier  'malloc'
     1>Main.cpp(85): error C2065: 'pHandleInfos' : undeclared identifier
     1>Main.cpp(86): error C2065: 'SystemHandleInformation' : undeclared identifier
      1>Main.cpp(86): error C2065: 'pHandleInfos' : undeclared identifier
     1>Main.cpp(87): error C3861: 'NT_SUCCESS': identifier not found
      1>Main.cpp(89): error C2065: 'STATUS_INFO_LENGTH_MISMATCH' : undeclared identifier
    1>Main.cpp(90): error C2065: 'pHandleInfos' : undeclared identifier
    1>Main.cpp(94): error C2065: 'pHandleInfos' : undeclared identifier
    1>Main.cpp(95): error C2065: 'pHandleInfos' : undeclared identifier
   1>Main.cpp(95): error C2065: 'PSYSTEM_HANDLE_INFORMATION' : undeclared identifier
    1>Main.cpp(95): error C2146: syntax error : missing ';' before identifier 'malloc'
     1>Main.cpp(98): error C2065: 'pHandleInfos' : undeclared identifier
   1>Main.cpp(102): error C2065: 'POBJECT_TYPE_INFORMATION' : undeclared identifier
   1>Main.cpp(102): error C2146: syntax error : missing ';' before identifier 'pType'
     1>Main.cpp(102): error C2065: 'pType' : undeclared identifier
  1>Main.cpp(102): error C2065: 'POBJECT_TYPE_INFORMATION' : undeclared identifier
    1>Main.cpp(102): error C2146: syntax error : missing ';' before identifier 'malloc'
   1>Main.cpp(103): error C2065: 'pType' : undeclared identifier
  1>Main.cpp(104): error C2065: 'pHandleInfos' : undeclared identifier
   1>Main.cpp(105): error C2065: 'pProcessInfos' : undeclared identifier
  1>Main.cpp(109): error C2065: 'pHandleInfos' : undeclared identifier
      1>Main.cpp(109): error C2227: left of '->HandleCount' must point to class/struct/union/generic type
   1>          type is ''unknown-type''
    1>Main.cpp(110): error C2065: 'pHandleInfos' : undeclared identifier
       1>Main.cpp(110): error C2227: left of '->Handles' must point to class/struct/union/generic type
   1>Main.cpp(110): error C2228: left of '.ProcessId' must have class/struct/union
   1>Main.cpp(111): error C2065: 'pHandleInfos' : undeclared identifier
  1>Main.cpp(111): error C2227: left of '->Handles' must point to class/struct/union/generic type
 1>          type is ''unknown-type''
 1>Main.cpp(111): error C2228: left of '.Handle' must have class/struct/union
  1>Main.cpp(119): error C2065: 'DUPLICATE_SAME_ATTRIBUTES' : undeclared identifier
    1>Main.cpp(119): error C2064: term does not evaluate to a function taking 7  arguments
   1>Main.cpp(120): error C3861: 'NT_SUCCESS': identifier not found
  1>Main.cpp(122): error C2065: 'ObjectTypeInformation' : undeclared identifier
  1>Main.cpp(122): error C2065: 'pType' : undeclared identifier
   1>Main.cpp(123): error C3861: 'NT_SUCCESS': identifier not found
  1>Main.cpp(124): error C2065: 'pType' : undeclared identifier
 1>Main.cpp(124): error C2227: left of '->TypeName' must point to class/struct/union/generic type
 1>          type is ''unknown-type''
 1>Main.cpp(124): error C2228: left of '.Buffer' must have class/struct/union
  1>Main.cpp(124): error C2065: 'pType' : undeclared identifier
    1>Main.cpp(124): error C2227: left of '->TypeName' must point to class/struct/union/generic type
 1>          type is ''unknown-type''
 1>Main.cpp(124): error C2228: left of '.Buffer' must have class/struct/union
   1>Main.cpp(127): error C2065: 'pProcessInfos' : undeclared identifier
1>Main.cpp(142): error C2065: 'pType' : undeclared identifier
 1>Main.cpp(144): error C2065: 'pHandleInfos' : undeclared identifier
 1>Main.cpp(145): error C2065: 'pProcessInfos' : undeclared identifier
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

1 个答案:

答案 0 :(得分:0)

这些类型未定义,因此编译器不知道:

td_NtQuerySystemInformation    NtQuerySystemInformation    = NULL; 
td_NtQueryObject               NtQueryObject               = NULL; 
td_NtDuplicateObject           NtDuplicateObject           = NULL; 

PSYSTEM_PROCESS_INFORMATIONPOBJECT_TYPE_INFORMATION等相同。

您需要包含他们的定义。