Xp / 2000 Treiber programmieren



  • Hallo,

    hat jemand Ahnung von der Treiber Programmierung unter XP/2000
    oder eine Idee wo es dazu nützliche Infos gibt.



  • JA:
    geht nciht mir dem Borland bzw der VCL.
    Du brauchst das MS Windows DDK (Driver Development Kit),
    bzw inzwischen (auch) das KMPF und das UMPF evtl.
    kriegste alles von MS im MSDN (http://msdn.com/)
    Dann brauchste noch ein Tutorial, das ganze geht shconmal nicht in C++,
    sondern nur in C, und dann ist das afaik
    auch noch ein Dialekt und kein Standard C

    Der Jemand

    p.s.: Das WIN32-Forum wäre glaube ich passender,
    auch wenn es trotzdem nicht ganz passt ..



  • Hallo,

    danke für Deine Antwort.

    Du brauchst das MS Windows DDK (Driver Development Kit),
    bzw inzwischen (auch) das KMPF und das UMPF evtl.

    Schon etliche male versucht bei Microsoft an das DDK ranzukommen,
    irgendwie aber nie geklappt. Gibt es einen Link wo man das ganze
    downloaden kann.

    das ganze geht shconmal nicht in C++,
    sondern nur in C

    Das ist mir schon klar.

    Dann brauchste noch ein Tutorial

    Wo bekomme ich soetwas.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • hermes schrieb:

    Schon etliche male versucht bei Microsoft an das DDK ranzukommen,
    irgendwie aber nie geklappt. Gibt es einen Link wo man das ganze
    downloaden kann.

    http://www.microsoft.com/whdc/devtools/ddk/default.mspx
    🙂



  • hermes schrieb:

    Dann brauchste noch ein Tutorial

    Wo bekomme ich soetwas.

    Im DDK sind hunderte von Beipielen dabei...

    Was willst Du denn genau machen? Hoffentlich nix mit Datei-System-Filtern... sonst rate ich Dir von DDK ab und kauf Dir das OSR-Kit:
    http://www.osr.com/toolkits_fddk.shtml



  • Jochen Kalmbach schrieb:

    hermes schrieb:

    Dann brauchste noch ein Tutorial

    Wo bekomme ich soetwas.

    Im DDK sind hunderte von Beipielen dabei...

    Was willst Du denn genau machen? Hoffentlich nix mit Datei-System-Filtern... sonst rate ich Dir von DDK ab und kauf Dir das OSR-Kit:
    http://www.osr.com/toolkits_fddk.shtml

    Ich würde gerne einen USB Treiber programmieren.



  • Für USB gibt es jetzt den "User-Mode-Treiber"; der ist einem Kernel-Mode-Treiber vorzuziehen, da Du hier keine Signierung (X64) bentötigst und er nicht gleich Dein ganzen Rechner zum Absturz bringt, wenn was schief lief...
    Siehe UMDF

    User-Mode Driver Framework (UMDF)
    http://www.microsoft.com/whdc/driver/wdf/UMDF.mspx

    How to Develop a UMDF Driver
    http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Developing-UMDF-Drvs.ppt

    The UMDF-USB Object Model
    http://msdn2.microsoft.com/en-us/library/bb314420.aspx

    Du bekommst das ganze hier (MS-Connect):
    http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx



  • BTW: auch Kernelmode Treiber kann man mit C++ programmieren.
    Man muss zwar auf einige Dinge achtgeben und z.T. etwas rumtricksen dafür (z.B. in welcher Section automatisch generierter Code liegt - pageable vs. non-pageable), aber i.A. funktioniert es recht gut.



  • Hallo,

    danke erstmal für die vielen Tips.

    Also die Treiberprogrammierung ist für mich absolutes Neuland!
    Ich denke aber das es nicht so kompliziert ist wie es auf dem ersten
    Blick aussieht.

    Das DDK habe ich installiert, angeblich soll es da einen Ordner
    Scr\ geben in dem sich Examples befinden der Ordner existiert
    aber nicht.

    Desweiteren gibt es any many Compiler/Linker Bin16,ia64,Win64\x86\...,x86.

    Welchen sollte man nehmen.

    Kann man nicht auch den Borland Builder zum Compilieren/Linken nehmen
    und sich eine DLL erstellen lassen?

    Die DDK Hilfe ist nicht wirklich eine Hilfe für Anfänger.

    Ich stelle mir vor Testweise einen Treiber für die PIO zu schreiben, mit
    dem ich auf die einzelnen Register der PIO zugreifen kann.
    War unter MS-Dos in ASM kein grosses Problem.

    Ist soetwas überhaupt machbar? und benötige ich dafür einen Treiber.

    Für USB gibt es jetzt den "User-Mode-Treiber"; der ist einem Kernel-Mode-Treiber vorzuziehen, da Du hier keine Signierung (X64) bentötigst und er nicht gleich Dein ganzen Rechner zum Absturz bringt, wenn was schief lief...

    Hört sich gut an, denke aber ich sollte mich zuerst einwenig in die
    Grundlagen einarbeiten.

    Gibt es da gute Literatur zu dem Thema?



  • ganz einfache sachen gehen auch ohne kerneltreiber: http://wookey.org/usermodehardwareportio.html



  • Scheint ja eine ganz einfache Sache zu sein.

    Hat mein Prozess anschliessend wirklich zugriff auf sämtliche
    IO's (Uart,Timer,IRQ/DMA Controller...)

    Ich dachte immer unter NT/XP/2000) ist dieses nicht so einfach zu realisieren.

    #define STRICT
    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <tchar.h>
    //------------------------------------------------------------------
    //
    //------------------------------------------------------------------
    BOOL EnablePrivilege(PTCHAR Privilege)
    {
        BOOL rc = FALSE;
        HANDLE hToken;
        LUID luid;
        TOKEN_PRIVILEGES tokenPrivilege;
        //  Open the current process' token.
        rc = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
        if (rc)
        {
            rc = LookupPrivilegeValue(NULL, Privilege, &luid);
            if (rc)
            {
                tokenPrivilege.PrivilegeCount = 1;
                tokenPrivilege.Privileges[0].Luid = luid;
                tokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
                //  Assign the given privilege.
                rc = AdjustTokenPrivileges(hToken,FALSE,&tokenPrivilege,sizeof(tokenPrivilege),NULL,NULL);
            }
        }
        if (hToken)
            CloseHandle(hToken);
        return rc;
    }
    //------------------------------------------------------------------
    //
    //------------------------------------------------------------------
    BOOL EnableUserModeHardwareIO()
    {
        typedef ULONG (__stdcall* pfn_ZwSetInformationProcess)(HANDLE,ULONG,PVOID,ULONG);
        BOOL rc = FALSE;
        HMODULE hNtDll = NULL;
        ULONG IOPL = 3;
        INT ProcessUserModeIOPL = 16;
        pfn_ZwSetInformationProcess ZwSetInformationProcess;
        hNtDll = GetModuleHandle("ntdll.dll");
        if (hNtDll)
        {
            ZwSetInformationProcess = (pfn_ZwSetInformationProcess)
    		//Proc Addresse aus der DLL			
                GetProcAddress(hNtDll, "ZwSetInformationProcess");
            if (ZwSetInformationProcess)
            {
                //  Enable SeTcbPrivilege
                rc = EnablePrivilege(SE_TCB_NAME);
                if (rc)
                {
                    //  Grant user mode hardware IO access.
                    rc = ZwSetInformationProcess(GetCurrentProcess(),ProcessUserModeIOPL,&IOPL,sizeof(IOPL));
                    //  An NTSTATUS is returned, so zero is success.
                    if (!rc)
                       rc = TRUE;
                }
            }
        }
        return rc;
    }
    int __cdecl 
    //------------------------------------------------------------------
    //
    //------------------------------------------------------------------
    main(int argc,char* argv[])
    {
        UNREFERENCED_PARAMETER(argc);   //  To compile cleanly at /W4
        UNREFERENCED_PARAMETER(argv);   //  To compile cleanly at /W4
        if(EnableUserModeHardwareIO())
        {
            //  Hard boot the machine via writing directly to the keyboard
            //  controller...
            __asm mov dx, 0x64
            __asm mov al, 0xFE
            __asm out dx, al
        }
        return 0;
    }
    


  • Hallo,

    Habe eine Ansatzweise ganz brauchbare Präsentation gefunden.

    http://www.ruhr-uni-bochum.de/dv/lehre/seminar/winnt-treiber/sld001.htm

    Werde es mal mit dem Beispiel MAPMEM versuchen, wobei mir immer noch nicht klar ist
    wie ich das den nun mit dem DDK compilieren und linken soll.


Anmelden zum Antworten