Xp / 2000 Treiber programmieren
-
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 CDas 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.
-
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.shtmlIch 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 UMDFUser-Mode Driver Framework (UMDF)
http://www.microsoft.com/whdc/driver/wdf/UMDF.mspxHow to Develop a UMDF Driver
http://download.microsoft.com/download/f/0/5/f05a42ce-575b-4c60-82d6-208d3754b2d6/Developing-UMDF-Drvs.pptThe UMDF-USB Object Model
http://msdn2.microsoft.com/en-us/library/bb314420.aspxDu 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.
