Problem mit NtQuerySystemInformation



  • Hallo, ich versuche mit NtQuerySystemInformation die aktuell laufenden Prozesse aufzulisten. Nachdem mehrere Versuche fehlschlugen und ich nicht zum Ziel kam hab ich gegoogelt und folgenden Code gefunden:

    Nun meine Frage: Woher kommt dise SYSTEM_HANDLE_INFORMATION Struktur?
    In der MSDN habe ich dazu nichts gefunden.

    #include <windows.h>
    #include <stdio.h>
    
    typedef DWORD (NTAPI *pNtQuerySystemInformation)(DWORD info_class, void *out, DWORD size, DWORD *out_size);
    
    struct SYSTEM_HANDLE_INFORMATION
    {
    	ULONG	ProcessId;
    	UCHAR	ObjectTypeNumber;
    	UCHAR	Flags;
    	USHORT	Handle;
    	PVOID	Object;
    	ACCESS_MASK	GrantedAccess;
    };
    
    SYSTEM_HANDLE_INFORMATION buf[100000];
    
    int main()
    {
    DWORD size;
    pNtQuerySystemInformation NtQuerySystemInformation =
    (pNtQuerySystemInformation) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
    
    	NtQuerySystemInformation(16, buf, sizeof(buf), &size);
    	DWORD n = size/sizeof(SYSTEM_HANDLE_INFORMATION);
    
    	for (DWORD i=0; i<n; i++)
    	{
               printf("%08x: PID: %08x, type: %02x, handle: %04x, ptr: %08x\n", i,
               buf[1].ProcessId, buf[1].ObjectTypeNumber, buf[1].Handle, buf[1].Object);
    	}
    
    }
    

    Nun mein neuer Versuch die laufenden Prozesse aufzulisten:

    #include <windows.h>
    #include <stdio.h>
    #include <conio>
    
    #define SystemBasicInformation 0
    
    typedef DWORD (NTAPI *pNtQuerySystemInformation)(DWORD info_class, void *out, DWORD size, DWORD *out_size);
    
    typedef struct _SYSTEM_BASIC_INFORMATION {
        BYTE Reserved1[24];
        PVOID Reserved2[4];
        CCHAR NumberOfProcessors;
    } SYSTEM_BASIC_INFORMATION;
    
    SYSTEM_BASIC_INFORMATION buf[100000];
    
    int main()
    {
    DWORD size;
    pNtQuerySystemInformation NtQuerySystemInformation =
    (pNtQuerySystemInformation) GetProcAddress(GetModuleHandle("ntdll.dll"), "NtQuerySystemInformation");
    
    	int ret = NtQuerySystemInformation(SystemBasicInformation, buf, sizeof(buf), &size);
            printf("%x\n",ret);
    
            getch();
    }
    

    ret gibt mir zurück: 0xC0000004

    STATUS_INFO_LENGTH_MISMATCH
    The specified information record length does not match the length that is required for the specified information class.

    Die MSDN sagt:
    When the SystemInformationClass parameter is SystemBasicInformation, the buffer pointed to by the SystemInformation parameter should be large enough to hold a single SYSTEM_BASIC_INFORMATION structure having the following layout:

    typedef struct _SYSTEM_BASIC_INFORMATION {
        BYTE Reserved1[24];
        PVOID Reserved2[4];
        CCHAR NumberOfProcessors;
    } SYSTEM_BASIC_INFORMATION;
    

    Mein Buffer ist ja wohl groß genug ... Hat wer eine Idee wie man es richtig macht?

    Und nein ich will nicht eine andere Funktion zum Prozesse auflisten benutzen.





  • Mein Ziel ist es aber das ganze mit NtQuerySystemInformation umuzsetzen.

    Ich habe gerade gesehen das der Windows Taskmanager die Funktion ZwQuerySystemInformation verwendet ich versuch mal rauszufinden wie Microsoft das umgesetzt hat.



  • Ich verstehe eh nicht ganz was Du da machst... Du verwendest BASIC_INFORMATION... das hat doch nichts mit den Prozessen zu tun... auch verwendest Du "HANDLEE_INFORMATION" was auch nix mit den Prozessen zu tun hat... ist mir schleierhaft... schau doch einfach in die Doku...
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms724509



  • Welche Struktur ist den die richtig um Prozesse aufzulisten?
    In der Doku ist das irgendwie nicht beschrieben.

    Ich würde ja mal stark auf diese Struktur tippen:

    typedef struct _SYSTEM_PROCESS_INFORMATION {
        ULONG NextEntryOffset;
        BYTE Reserved1[52];
        PVOID Reserved2[3];
        HANDLE UniqueProcessId;
        PVOID Reserved3;
        ULONG HandleCount;
        BYTE Reserved4[4];
        PVOID Reserved5[11];
        SIZE_T PeakPagefileUsage;
        SIZE_T PrivatePageCount;
        LARGE_INTEGER Reserved6[6];
    } SYSTEM_PROCESS_INFORMATION;
    

    Aber auch da sehe ich nichts von Prozess Namen oder so ...



  • Es ist nicht Dokumentiert, wo diese Info steht... Du kannst aber offizielle Methoden verwenden um den Namen rauszubekommen...



  • Query schrieb:

    Welche Struktur ist den die richtig um Prozesse aufzulisten?
    In der Doku ist das irgendwie nicht beschrieben.

    Ich würde ja mal stark auf diese Struktur tippen:

    typedef struct _SYSTEM_PROCESS_INFORMATION {
        ULONG NextEntryOffset;
        BYTE Reserved1[52];
        PVOID Reserved2[3];
        HANDLE UniqueProcessId;
        PVOID Reserved3;
        ULONG HandleCount;
        BYTE Reserved4[4];
        PVOID Reserved5[11];
        SIZE_T PeakPagefileUsage;
        SIZE_T PrivatePageCount;
        LARGE_INTEGER Reserved6[6];
    } SYSTEM_PROCESS_INFORMATION;
    

    Aber auch da sehe ich nichts von Prozess Namen oder so ...

    Ja das ist die Struktur, nur ein bisschen beschränkt gegen aussen, da eigentlich der Rest intern gebraucht wird.

    Bei http://undocumented.ntinternals.net/ ist die Struktur so zu sehen.

    typedef struct _SYSTEM_PROCESS_INFORMATION {
    
    ULONG NextEntryOffset;
    ULONG NumberOfThreads;
    LARGE_INTEGER Reserved[3]; 
    LARGE_INTEGER CreateTime; 
    LARGE_INTEGER UserTime; 
    LARGE_INTEGER KernelTime; 
    UNICODE_STRING ImageName; 
    KPRIORITY BasePriority; 
    HANDLE ProcessId; 
    HANDLE InheritedFromProcessId; 
    ULONG HandleCount; 
    ULONG Reserved2[2]; 
    ULONG PrivatePageCount; 
    VM_COUNTERS VirtualMemoryCounters; 
    IO_COUNTERS IoCounters; 
    SYSTEM_THREAD Threads[0];
    
    } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
    

    Jetzt solltest Du denn ImageName finden 😉
    Funktioniert ohne Probleme von xp-win8. Aber immer schön im Kopf halten was MS dazu sagt.

    [NtQuerySystemInformation may be altered or unavailable in future versions of Windows. Applications should use the alternate functions listed in this topic.]



  • @-lowbyte-:
    Ein bisschen gogglen sollte man doch den anderen Userna auch zutrauen.... wer dazu nicht in der Lage ist, der sollte so einen Code auch nicht schreiben dürfen...



  • Ja da hast Du recht.


Anmelden zum Antworten