NTAPI: NtCreateFile gibt STATUS_INVALID_PARAMETER zurück, warum?



  • Hallo,
    ich habe eine Problem mit der Funktion NtCreateFile (identisch zu ZwCreateFile):
    Ich möchte nur eine Datei öffnen, lesen, schreiben und wieder schließen (theoretisch würden fopen/fread/fwrite/fclose reichen, kann ich aber nicht verwenden für eine NT-Anwendung).

    Hier der reduzierte Code:

    #define FILENAME _T("\\??\\c:\\datei")
    
    HANDLE datei_h;
    OBJECT_ATTRIBUTES datei_a;
    UNICODE_STRING datei_n;
    IO_STATUS_BLOCK datei_s;
    NTSTATUS status;
    
    RtlInitUnicodeString(&datei_n, FILENAME);
    InitializeObjectAttributes(
    	&datei_a,
    	&datei_n,
    	OBJ_CASE_INSENSITIVE,
    	NULL,
    	NULL
    	);
    status = NtCreateFile(
    	&datei_h,
    	GENERIC_READ | GENERIC_WRITE,
    	&datei_a,
    	&datei_s,
        NULL,
        FILE_ATTRIBUTE_NORMAL,
    	0,
        FILE_OPEN,
        FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS | FILE_SYNCHRONOUS_IO_NONALERT,
    	NULL,
    	0
    	);
    

    Das Problem ist nun folgendes:
    status hat danach immer den Wert 0xC000000D (STATUS_INVALID_PARAMETER), leider weiß ich nicht welcher Parameter falsch ist. Ich habe leider auch kein Beispielcode gefunden, sondern nur diese Dokumentation: http://www.osronline.com/DDKx/kmarch/k111_9dte.htm
    Kann mir jemand sagen wo mein Fehler liegt?

    Viele Grüße,
    S_O



  • Warum verwendest Du nicht dokumentierte Funktionen des User-Modes? => CreateFile



  • Warum verwendest Du nicht dokumentierte Funktionen des User-Modes? => CreateFile

    Das ist ein natives NT-Programm, kein win32-Programm, soweit ich weiß kann man da nichts anderes benutzen.



  • Was ist denn ein "natives" NT-Programm...
    Es gibt halt nun mal keine offizielle Doku zu der nativen-WinAPI, somit sind alle Programme die sowas verwenden murks... (meine pers. Meinung)



  • Was ist denn ein "natives" NT-Programm...

    Eins das direkt auf NT aufsetzt, wie Gerätetreiber, und nicht auf win32.

    Es gibt halt nun mal keine offizielle Doku zu der nativen-WinAPI, somit sind alle Programme die sowas verwenden murks... (meine pers. Meinung)

    Native NT-Programme scheinen von MS wirklich schlecht bis gar nicht dokumentiert zu sein, aber Gerätetreiber schon.
    Das ist im Grunde ein Programm, das man so schreiben muss wie ein Gerätetreiber.
    Diese Funktion ist genau die, die man auch in einem Gerätetreiber verwenden müsste, wollte man mit einem Gerätetreiber direkt auf eine Datei zugreifen.

    Die Frage ist natürlich, warum muss es einen natives NT-Programm sein und kein win32. Es soll (muss damit es richtig funktioniert) wärend das Bootvorgangs gestartet werden, zur gleichen Zeit wie scandisk (autochk), da geht win32 noch nicht.
    Als win32 läuft das Programm bereits perfekt, ich muss es jetzt "nur" noch auf native-NT portieren.



  • hat zwar nichts mit deinem problem zu tun, aber vielleicht findste diese seite interessant: http://www.sysinternals.com/information/nativeapplications.html
    und: http://www.sysinternals.com/information/nativeapi.html



  • S_O schrieb:

    Eins das direkt auf NT aufsetzt, wie Gerätetreiber, und nicht auf win32.

    Ich dachte wir reden von User-Mode Apps und nicht von Device-Treibern (da hätte er nämlich *nicht* NtCreateFile verwendet!)



  • hat zwar nichts mit deinem problem zu tun, aber vielleicht findste diese seite interessant: http://www.sysinternals.com/information/nativeapplications.html
    und: http://www.sysinternals.com/information/nativeapi.html

    Von genau diesen Seiten weiß ich wie man so ein Programm überhaupt macht 🙂
    Viel mehr scheint es dazu leider auch nicht zu geben.



  • Ich dachte wir reden von User-Mode Apps und nicht von Device-Treibern (da hätte er nämlich *nicht* NtCreateFile verwendet!)

    Ich mein genau so ein Programm, wie das in den Seiten die net gepostet hat beschrieben wird.



  • Also ein Device/Filter-Treiber. Dann lädst Du Dir das DDK runter und da sind tausende Beispiele dabei:
    http://www.microsoft.com/whdc/driver/wdf/KMDF_pkg.mspx



  • Also ein Device/Filter-Treiber. Dann lädst Du Dir das DDK runter und da sind tausende Beispiele dabei:
    http://www.microsoft.com/whdc/driver/wdf/KMDF_pkg.mspx

    Das DDK hab ich natürlich installiert, ich brauch ja die header/libs daraus um mein Programm zu kompilireren. Ich habe jetzt auch die Beispiele nachinstalliert, ich habe jetzt alles nach *CreateFile* durchsucht, aber kein Beispiel scheint ZwCreateFile oder NtCreateFile zu verwenden, nur win32-Anwendungen die CreateFile verwenden hab ich gefunden.

    Hat irgendjemand eine Idee, wo mein Fehler liegen könnte? Es handelt sich wie gesagt nicht um eine win32-Anwendung, sondern um so was ähnliches wie ein Gerätetreiber.

    Ist der Dateiname den so richtig? Meinchmal liegt es ja an so einfachen Sachen. Sind die Laufwerksbuchstaben da überhaupt verfügbar oder muss man da vielleicht eine andere Schreibweise mit Device\Harddisk0\Partition1, \?\Volume{08a4ee15-86cd-11d4-a06e-806d6172696f}\ oder was auch immer verwenden?





  • Ich hab es jetzt mal NtOpenFile anstelle von NtCreateFile versucht, jetzt klappt es:

    status = NtOpenFile(
    	&datei_h,
    	GENERIC_READ | GENERIC_WRITE,
    	&datei_a,
    	&datei_s,
    	0,
    	FILE_NON_DIRECTORY_FILE | FILE_RANDOM_ACCESS
    	);
    

    Vielen Dank!


Anmelden zum Antworten