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?!


Anmelden zum Antworten