#include <ntddk.h> #pragma pack(1) typedef struct _DEVICE_EXTENSION_ { PDEVICE_OBJECT pdo; UNICODE_STRING ustrSymLinkName; } DEVICE_EXTENSION, *PDEVICE_EXTENSION; NTSTATUS OnUnLoad( IN PDRIVER_OBJECT pDriverObject ) { PDEVICE_OBJECT pNextDevObj; int i; DbgPrint( "OnUnLoad" ); pNextDevObj = pDriverObject->DeviceObject; for ( i = 0; pNextDevObj!=NULL; i++ ) { PDEVICE_EXTENSION dx = (PDEVICE_EXTENSION)pNextDevObj->DeviceExtension; UNICODE_STRING *pLinkName = & (dx->ustrSymLinkName); pNextDevObj = pNextDevObj->NextDevice; DbgPrint( " OnUnLoad Deleting device (%d) : pointer to PDO = %X. ", i, dx->pdo ); DbgPrint( "OnUnLoad Deleting symLink = %ws.", pLinkName->Buffer ); IoDeleteSymbolicLink( pLinkName ); IoDeleteDevice( dx->pdo ); } return STATUS_SUCCESS; } NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { NTSTATUS status = STATUS_SUCCESS; PDEVICE_OBJECT pdo; UNICODE_STRING devName; UNICODE_STRING symLinkName; PDEVICE_EXTENSION pdx; RtlInitUnicodeString( &devName, L"\\Device\\PavelDevice" ); RtlInitUnicodeString( &symLinkName, L"\\DosDevices\\PavelDevice " ); pDriverObject->DriverUnload = OnUnLoad; status = IoCreateDevice( pDriverObject, sizeof( DEVICE_EXTENSION ), &devName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pdo ); if ( !NT_SUCCESS(status) ) { DbgPrint( "DriverEntry IoCreateDevice error" ); return status; } pdx = (PDEVICE_EXTENSION)pdo->DeviceExtension; pdx->pdo = pdo; pdx->ustrSymLinkName = symLinkName; status = IoCreateSymbolicLink( &symLinkName, &devName ); if ( !NT_SUCCESS(status) ) { IoDeleteDevice( pdo ); return status; } DbgPrint( "DriverEnrty successfully completed." ); return status; } |