Example #1
0
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
Example #2
0
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;
}