Filter driver + Bluescreen
-
Hi schonwieder
,
ich möchte einen Filtertreiber schreiben, welcher Udp Pakete verändert. Ich wollte das so machen das so:#define DO(s) {DbgPrint(s);} PDEVICE_OBJECT pUDPObject=NULL; PDEVICE_OBJECT pOldUDPObject=NULL; NTSTATUS Entry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath) { DO("Entry begin..."); for (int iFunction = 0; iFunction<IRP_MJ_MAXIMUM_FUNCTION; iFunction++) pDriverObject->MajorFunction[iFunction] = Dispatch; pDriverObject->DriverUnload=Unload; NTSTATUS Return = IoCreateDevice(pDriverObject, 0, NULL, FILE_DEVICE_UNKNOWN, 0, TRUE, &pUDPObject); if (Return != STATUS_SUCCESS) { DOERR; return Return; } pUDPObject->Flags |= DO_DIRECT_IO; UNICODE_STRING UDPDeviceName; RtlInitUnicodeString(&UDPDeviceName, L"\\Device\\Tcp"); //Hier zum Test erstmal TCP Return = IoAttachDevice(pUDPObject, &UDPDeviceName, &pOldUDPObject); if (Return != STATUS_SUCCESS) { IoDeleteDevice(pUDPObject); DOERR; return Return; } DO("Entry end"); return Return; } typedef struct _EXAMPLE_FILTER_EXTENSION { PDEVICE_OBJECT pNextDeviceInChain; } EXAMPLE_FILTER_EXTENSION, *PEXAMPLE_FILTER_EXTENSION; // Aus tutorial NTSTATUS Dispatch(PDEVICE_OBJECT pDeviceObject,PIRP pIRP) { DO("Dispatch begin..."); NTSTATUS NtStatus = STATUS_NOT_SUPPORTED; PEXAMPLE_FILTER_EXTENSION pExampleFilterDeviceContext = (PEXAMPLE_FILTER_EXTENSION)pDeviceObject->DeviceExtension; DbgPrint("ExampleFilter_UnSupportedFunction Called \r\n"); IoSkipCurrentIrpStackLocation(pIRP); IoCallDriver(pExampleFilterDeviceContext->pNextDeviceInChain, pIRP); DO("Dispatch end..."); return NtStatus; }leider bekomme ich direkt nach dem Laden des Treibers einen Bluescreen und der Rechner fährt sich selber herunter. Wenn ich nun die Dispatch-Funktion durch diese ersetzte, gibt es keinen Bluescreen...
NTSTATUS Dispatch(PDEVICE_OBJECT pDeviceObject,PIRP pIRP) { DO("Dispatch begin..."); if (!pIRP) { DOWARNING; return STATUS_SUCCESS; } SCompletion Completion; memset(&Completion, NULL, sizeof(SCompletion)); PIO_STACK_LOCATION pIoStackIrp=IoGetCurrentIrpStackLocation(pIRP); switch (pIoStackIrp->MajorFunction) { case IRP_MJ_CREATE: DO("IRP_MJ_CREATE"); iNumDevicesCreated++; break; case IRP_MJ_DEVICE_CONTROL: DO("IRP_MJ_DEVICE_CONTROL"); break; case IRP_MJ_INTERNAL_DEVICE_CONTROL: DO("IRP_MJ_INTERNAL_DEVICE_CONTROL"); break; case IRP_MJ_CLEANUP: DO("IRP_MJ_CLEANUP"); break; case IRP_MJ_CLOSE: DO("IRP_MJ_CLOSE"); if(iNumDevicesCreated) iNumDevicesCreated--; break; default: DO("default"); break; } NTSTATUS Return; pIRP->IoStatus.Status = STATUS_SUCCESS; Return=STATUS_SUCCESS; IoCompleteRequest(pIRP, IO_NO_INCREMENT); DO("Dispatch end"); return Return; }
-
Irgendwie blicke ich diese ganze Treiberprogrammierung nicht

Kennt wer vllt. ein gutes Buch für mich?
-
Die erste DDispatch-Funktion muss natürlich heißen:
NTSTATUS Dispatch(PDEVICE_OBJECT pDeviceObject,PIRP pIRP) { DO("Dispatch begin..."); IoSkipCurrentIrpStackLocation(pIRP); return IoCallDriver(pOriginalUdpDevice, pIRP); }
-
Aus irgendeinem Grund klappt das jetzt?!