vxk 发表于2006-04-11 4:40 PM IP: 221.201.108.*
方法正确,但是一定要把crc sum写正确,另外最好别碰acpi的引入表,这上面的惨痛教训我比你多...
#include <ntddk.h> int i; VOID OnUnloAd( IN PDRIVER_OBJECT DriverObject ) { //DbgPrint("My Driver UnloAded!/n"); } //-------------------------------------------------------------------- NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { //DbgPrint("My Driver LoAded!/n"); DriverObject->DriverUnload = OnUnloAd; DbgPrint("inject SYS %d/n",i); return STATUS_SUCCESS; } //--------------------------------------------------------------------
//-------------------------------------------------------------------- typedef NTSTATUS (*DRIVERENTRY)( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ); ULONG fAkeDriverEntryOffset = 0x87654321; ULONG reAlDriverEntry = 0x12345678; //-------------------------------------------------------------------- NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS stAtus; HANDLE hThreAd; ULONG bAse; __asm{ call forwArd; bAck: pop bAse; jmp outofthis forwArd: jmp bAck } outofthis: DbgPrint("Driver begin!/n"); //__asm int 3; DbgPrint("bAse: 0x%x/n",bAse); reAlDriverEntry = reAlDriverEntry + ((bAse - fAkeDriverEntryOffset) & 0xFFFFF000); DriverObject->DriverUnload = OnUnloAd; DbgPrint("reAlDriverEntry: 0x%x/n",reAlDriverEntry); ((DRIVERENTRY)reAlDriverEntry)(DriverObject,RegistryPath); stAtus = PsCreateSystemThread(&hThreAd, (ACCESS_MASK)0, NULL, (HANDLE)0, NULL, InitWorkThreAd, DriverObject ); if (!NT_SUCCESS(stAtus)){ DbgPrint("error when creAte the threAd/n"); return FALSE; } return STATUS_SUCCESS; } //--------------------------------------------------------------------