NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo) { // AddDevice PAGED_CODE(); NTSTATUS status; PDEVICE_OBJECT fido; status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), NULL, GetDeviceTypeToUse(pdo), 0, FALSE, &fido); if (!NT_SUCCESS(status)) { // can't create device object KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status)); return status; } // can't create device object PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fido->DeviceExtension; do { // finish initialization IoInitializeRemoveLock(&pdx->RemoveLock, 0, 0, 0); pdx->DeviceObject = fido; pdx->Pdo = pdo; //将过滤驱动附加在底层驱动之上 PDEVICE_OBJECT fdo = IoAttachDeviceToDeviceStack(fido, pdo); if (!fdo) { // can't attach KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n")); status = STATUS_DEVICE_REMOVED; break; } // can't attach //记录底层驱动 pdx->LowerDeviceObject = fdo; //由于不知道底层驱动是直接IO还是BufferIO,因此将标志都置上 fido->Flags |= fdo->Flags & (DO_DIRECT_IO | DO_BUFFERED_IO | DO_POWER_PAGABLE); // Clear the "initializing" flag so that we can get IRPs fido->Flags &= ~DO_DEVICE_INITIALIZING; } while (FALSE); // finish initialization if (!NT_SUCCESS(status)) { // need to cleanup if (pdx->LowerDeviceObject) IoDetachDevice(pdx->LowerDeviceObject); IoDeleteDevice(fido); } // need to cleanup return status; } // AddDevice
NTSTATUS AddDevice(IN PDRIVER_OBJECT pDrvObj, IN PDEVICE_OBJECT pTgtDevObj) { NTSTATUS ntStat = STATUS_SUCCESS; UNICODE_STRING usTgtName; PDEVICE_OBJECT pHubFilter = NULL; PDEVICE_EXTENSION pDevExt = NULL; BOOLEAN isRootHub; // 1. Check if device is Root Hub isRootHub = USBPcapIsDeviceRootHub(pTgtDevObj); if (isRootHub == FALSE) { /* Do not attach to non-RootHub devices */ return STATUS_SUCCESS; } // 2. Create filter object ntStat = IoCreateDevice(pDrvObj, sizeof(DEVICE_EXTENSION), NULL, GetDeviceTypeToUse(pTgtDevObj), 0, FALSE, &pHubFilter); if (!NT_SUCCESS(ntStat)) { DkDbgVal("Error create Hub Filter!", ntStat); goto EndFunc; } pDevExt = (PDEVICE_EXTENSION) pHubFilter->DeviceExtension; pDevExt->deviceMagic = USBPCAP_MAGIC_ROOTHUB; pDevExt->pThisDevObj = pHubFilter; pDevExt->pDrvObj = pDrvObj; pDevExt->parentRemoveLock = NULL; IoInitializeRemoveLock(&pDevExt->removeLock, 0, 0, 0); ntStat = USBPcapAllocateDeviceData(pDevExt, NULL); if (!NT_SUCCESS(ntStat)) { goto EndFunc; } // 3. Attach to bus driver pDevExt->pNextDevObj = NULL; pDevExt->pNextDevObj = IoAttachDeviceToDeviceStack(pHubFilter, pTgtDevObj); if (pDevExt->pNextDevObj == NULL) { ntStat = STATUS_NO_SUCH_DEVICE; DkDbgStr("Error attach device!"); goto EndFunc; } pHubFilter->Flags |= (pDevExt->pNextDevObj->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO | DO_POWER_PAGABLE)); pHubFilter->Flags &= ~DO_DEVICE_INITIALIZING; if (NT_SUCCESS(ntStat)) { PDEVICE_OBJECT control = NULL; PUSBPCAP_ROOTHUB_DATA pRootData; USHORT id; ntStat = USBPcapCreateRootHubControlDevice(pDevExt, &control, &id); pRootData = pDevExt->context.usb.pDeviceData->pRootData; pRootData->controlDevice = control; pRootData->busId = id; } EndFunc: // If something bad happened if (!NT_SUCCESS(ntStat)) { USBPcapFreeDeviceData(pDevExt); if (pHubFilter) { IoDeleteDevice(pHubFilter); pHubFilter = NULL; } } return ntStat; }