NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING registrypath) { UNICODE_STRING devicename; PDEVICE_OBJECT device=NULL; NTSTATUS status; DbgPrint("pbfilter: > Entering DriverEntry()\n"); DbgPrint("pbfilter: setting up devicename\n"); RtlInitUnicodeString(&devicename, NT_DEVICE_NAME); DbgPrint("pbfilter: creating device\n"); status=IoCreateDevice(driver, sizeof(PBINTERNAL), &devicename, FILE_DEVICE_PEERBLOCK, 0, FALSE, &device); if(NT_SUCCESS(status)) { UNICODE_STRING devicelink; DbgPrint("pbfilter: created device, initting internal data\n"); DbgPrint("pbfilter: ... creating symbolic link\n"); RtlInitUnicodeString(&devicelink, DOS_DEVICE_NAME); status=IoCreateSymbolicLink(&devicelink, &devicename); DbgPrint("pbfilter: ... setting up irp-handling functions\n"); driver->MajorFunction[IRP_MJ_CREATE]= driver->MajorFunction[IRP_MJ_CLOSE]=drv_create; driver->MajorFunction[IRP_MJ_CLEANUP]=drv_cleanup; driver->MajorFunction[IRP_MJ_DEVICE_CONTROL]=drv_control; driver->DriverUnload=drv_unload; device->Flags|=DO_BUFFERED_IO; DbgPrint("pbfilter: ... setting up device extension\n"); g_internal=device->DeviceExtension; DbgPrint("pbfilter: ... initializing lock and queue\n"); KeInitializeSpinLock(&g_internal->rangeslock); KeInitializeSpinLock(&g_internal->destinationportslock); KeInitializeSpinLock(&g_internal->sourceportslock); InitNotificationQueue(&g_internal->queue); DbgPrint("pbfilter: ... resetting counters\n"); g_internal->blockedcount = 0; g_internal->allowedcount = 0; g_internal->destinationportcount = 0; g_internal->sourceportcount = 0; DbgPrint("pbfilter: internal data initted\n"); } if(!NT_SUCCESS(status)) { DbgPrint("pbfilter: * ERROR: couldn't create device, status:[0x%lX] . . . unloading\n", status); drv_unload(driver); } DbgPrint("pbfilter: < Leaving DriverEntry(), status:[0x%lX]\n", status); return status; }
static int stm_drm_platform_remove(struct platform_device *pdev) { struct drm_device *ddev = platform_get_drvdata(pdev); DRM_DEBUG("%s\n", __func__); drm_dev_unregister(ddev); drv_unload(ddev); drm_dev_put(ddev); return 0; }