亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usblspnp.c

?? microsoft usb開發(fā)包,能夠給大家一個很好的參考.
?? C
?? 第 1 頁 / 共 3 頁
字號:
NTSTATUS
USBLS120_IrpCompletionRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    )
/*++

Routine Description:

    Used as a  general purpose completion routine so it can signal an event,
    passed as the Context, when the next lower driver is done with the input Irp.
    This routine is used by both PnP and Power Management logic.

    Even though this routine does nothing but set an event, it must be defined and
    prototyped as a completetion routine for use as such


Arguments:

    DeviceObject - Pointer to the device object for the class device.

    Irp - Irp completed.

    Context - Driver defined context, in this case a pointer to an event.

Return Value:

    The function value is the final status from the operation.

--*/
{
    PKEVENT event = Context;

    // Set the input event
    KeSetEvent(
        event,
        1,       // Priority increment  for waiting thread.
        FALSE);  // Flag this call is not immediately followed by wait.

    // This routine must return STATUS_MORE_PROCESSING_REQUIRED because we have not yet called
    // IoFreeIrp() on this IRP.
    return STATUS_MORE_PROCESSING_REQUIRED;

}


NTSTATUS
USBLS120_FdoDeviceQuery(
    IN PDEVICE_OBJECT pDeviceObject,
    IN PIRP pIrp)
/*++

Routine Description:

    Handler for IRP_MN_QUERY_DEVICE_RELATIONS.
    Enumerates our child PDO.

Arguments:

    DeviceObject - pointer to our child PDO

    Irp          - pointer to an I/O Request Packet

Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_RELATIONS DeviceRelations;
    PDEVICE_EXTENSION DeviceExtension;
    PDEVICE_EXTENSION PdoExtension;
    UNICODE_STRING PdoUniName;
    static UCHAR PdoCount=0;

    //NOTE: This name be unique to each hardware vendor
    //      to avoid name collision between different
    //      drivers based on this code
    WCHAR PdoName[] = CHILD_PDO_NAME;

    irpStack = IoGetCurrentIrpStackLocation(pIrp);
    DeviceExtension = pDeviceObject->DeviceExtension;

    switch (irpStack->Parameters.QueryDeviceRelations.Type)
    {
        case BusRelations:
 
            // Allocate space for 1 child PDO
            DeviceRelations = ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));

            // If we can't allocate DeviceRelations structure, bail
            if (!DeviceRelations) {
                ntStatus = STATUS_INSUFFICIENT_RESOURCES;
                pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
            }
            else {
                DeviceRelations->Count = 0;
			
                if ((!DeviceExtension->ChildPdo) && (PdoCount<9)) {
                    RtlInitUnicodeString (&PdoUniName, PdoName);
                    PdoName [((sizeof(PdoName)/sizeof(WCHAR)) - 2)] = L'0' + PdoCount++;

                    ntStatus = IoCreateDevice(
                        USBLS120DriverObject,
                        sizeof(DEVICE_EXTENSION),
                        &PdoUniName,
                        FILE_DEVICE_MASS_STORAGE,
                        0,
                        FALSE,
                        &DeviceExtension->ChildPdo
                        );

                    if(NT_SUCCESS(ntStatus))
                    {
                        PdoExtension = DeviceExtension->ChildPdo->DeviceExtension;

                        // Mark the device object as our child PDO
                        PdoExtension->DeviceObjectType = DO_PDO;

                        DeviceExtension->ChildPdo->Flags &= ~DO_DEVICE_INITIALIZING;
		
                        DeviceRelations->Objects[DeviceRelations->Count++] = DeviceExtension->ChildPdo;
                        ObReferenceObject(DeviceExtension->ChildPdo);
                    }
                }
                else {
                    // Child PDO already exists, just return it
                    DeviceRelations->Objects[DeviceRelations->Count++] = DeviceExtension->ChildPdo;
                    ObReferenceObject(DeviceExtension->ChildPdo);
                }
		
                pIrp->IoStatus.Information = (ULONG)DeviceRelations;
                ntStatus = pIrp->IoStatus.Status = STATUS_SUCCESS;
            }
		
            break;

	default:
            // We pass on any non-BusRelations IRP
            IoSkipCurrentIrpStackLocation (pIrp);
            ntStatus = IoCallDriver (DeviceExtension->TopOfStackDeviceObject, pIrp);

    }

    return ntStatus;
}
		


NTSTATUS
USBLS120_PdoProcessPnPIrp(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++

Routine Description:

    Dispatch table routine for IRP_MJ_PNP.
    Process the Plug and Play IRPs sent to our PDO.

Arguments:

    DeviceObject - pointer to our child PDO

    Irp          - pointer to an I/O Request Packet

Return Value:

    NT status code

--*/
{
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PDEVICE_OBJECT stackDeviceObject;

    //
    // Get a pointer to the current location in the Irp. This is where
    //     the function codes and parameters are located.
    //
    
    USBLS120_KdPrint( DBGLVL_MEDIUM, ( "enter USBLS120_PdoProcessPnPIrp()\n"));

    irpStack = IoGetCurrentIrpStackLocation (Irp);

    //
    // Get a pointer to the device extension
    //

    deviceExtension = DeviceObject->DeviceExtension;
    stackDeviceObject = deviceExtension->TopOfStackDeviceObject;

    USBLS120_KdPrint( DBGLVL_MEDIUM, ( "enter USBLS120_ProcessPnPIrp() IRP_MJ_PNP, minor %s\n",
    USBLS120_StringForPnpMnFunc( irpStack->MinorFunction ) ));

    // inc the FDO device extension's pending IO count for this Irp
    //USBLS120_IncrementIoCount(DeviceObject);

    USBLS120_ASSERT( IRP_MJ_PNP == irpStack->MajorFunction );

    switch (irpStack->MinorFunction)
    {
        case IRP_MN_QUERY_DEVICE_RELATIONS:
            ntStatus = USBLS120_PdoDeviceQuery(DeviceObject, Irp);
            break;


	case IRP_MN_QUERY_ID:
            ntStatus = USBLS120_PdoQueryID(DeviceObject, Irp);
            break;


	case IRP_MN_REMOVE_DEVICE:
            IoDeleteDevice(DeviceObject);
            break;


	case IRP_MN_QUERY_BUS_INFORMATION:
            ntStatus = USBLS120_QueryBusInfo(DeviceObject, Irp);
            break;
    }

    return (ntStatus);
}


NTSTATUS
USBLS120_QueryBusInfo(
    IN PDEVICE_OBJECT pDeviceObject,
    IN PIRP pIrp
    )
{
    NTSTATUS ntStatus;
    PIO_STACK_LOCATION irpStack;
    PPNP_BUS_INFORMATION BusInfo;
        	
    USBLS120_KdPrint( DBGLVL_MEDIUM, ( "enter USBLS120_QueryBusInfo()\n"));

    irpStack = IoGetCurrentIrpStackLocation(pIrp);

    BusInfo = ExAllocatePool(PagedPool, sizeof(PNP_BUS_INFORMATION));

    // If we can't allocate BusInfo structure, bail
    if (!BusInfo) {
        pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }
    else {
        BusInfo->BusTypeGuid = GUID_BUS_USBLS120;
        BusInfo->LegacyBusType = PNPBus;
        BusInfo->BusNumber = 0;
			
        pIrp->IoStatus.Information = (ULONG)BusInfo;
        ntStatus = pIrp->IoStatus.Status = STATUS_SUCCESS;
    }

    return ntStatus;
}										



NTSTATUS
USBLS120_PdoDeviceQuery(
    IN PDEVICE_OBJECT pDeviceObject,
    IN PIRP pIrp
    )
{
    NTSTATUS ntStatus;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_RELATIONS DeviceRelations;
    PDEVICE_EXTENSION DeviceExtension;
        	
    USBLS120_KdPrint( DBGLVL_DEFAULT, ( "enter USBLS120_PdoDeviceQuery()\n"));

    irpStack = IoGetCurrentIrpStackLocation(pIrp);
    DeviceExtension = pDeviceObject->DeviceExtension;

    switch (irpStack->Parameters.QueryDeviceRelations.Type)
    {
	case TargetDeviceRelation:

            // Allocate space for 1 child device
            DeviceRelations = ExAllocatePool(PagedPool, sizeof(DEVICE_RELATIONS));

            // If we can't allocate DeviceRelations structure, bail
            if (!DeviceRelations) {
                pIrp->IoStatus.Status = STATUS_UNSUCCESSFUL;
                ntStatus = STATUS_INSUFFICIENT_RESOURCES;
            }
            else {
                ObReferenceObject(pDeviceObject);
			
                DeviceRelations->Count = 1;
                DeviceRelations->Objects[0] = pDeviceObject;
			
                pIrp->IoStatus.Information = (ULONG)DeviceRelations;
                ntStatus = pIrp->IoStatus.Status = STATUS_SUCCESS;
            }
		
            break;

	default:
            ntStatus = pIrp->IoStatus.Status;
    }

	return ntStatus;
}										



NTSTATUS
USBLS120_PdoQueryID(
    IN PDEVICE_OBJECT pDeviceObject,
    IN PIRP pIrp)
{
    PIO_STACK_LOCATION ioStack;
    PWCHAR buffer;
    WCHAR IDString[] = CHILD_DEVICE_ID;
    WCHAR InstanceIDString[] = L"0000";
    ULONG length;

    USBLS120_KdPrint( DBGLVL_MEDIUM, ( "enter USBLS120_PdoQueryID()\n"));

    ioStack = IoGetCurrentIrpStackLocation(pIrp);

    switch (ioStack->Parameters.QueryId.IdType)
    {
        case BusQueryHardwareIDs:
            // return a multi WCHAR (null terminated) string (null terminated)
            // array for use in matching hardare ids in inf files;


        case BusQueryDeviceID:
            // return a WCHAR (null terminated) string describing the device
            // For symplicity we make it exactly the same as the Hardware ID.
       
            length = sizeof (IDString) * sizeof(WCHAR);
            buffer = ExAllocatePool (PagedPool, length);

            if (buffer) {
                RtlCopyMemory (buffer, IDString, length);
            }

            pIrp->IoStatus.Information = (ULONG) buffer;
            break;


        case BusQueryInstanceID:
            length = sizeof (InstanceIDString) * sizeof(WCHAR);
            buffer = ExAllocatePool (PagedPool, length);

            if (buffer) {
                RtlCopyMemory (buffer, InstanceIDString, length);
            }

            pIrp->IoStatus.Information = (ULONG) buffer;
            break;
    }
    return STATUS_SUCCESS;
}


NTSTATUS
USBLS120_AbortPipes(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Called as part of sudden device removal handling.
    Cancels any pending transfers for all open pipes. 
    If any pipes are still open, call USBD with URB_FUNCTION_ABORT_PIPE
    Also marks the pipe 'closed' in our saved  configuration info.

Arguments:

    Ptrs to our FDO

Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus = STATUS_SUCCESS;
    PURB urb;
    PDEVICE_EXTENSION deviceExtension;
    ULONG i;

    PUSBD_INTERFACE_INFORMATION interface;
    PUSBD_PIPE_INFORMATION PipeInfo;

    deviceExtension = DeviceObject->DeviceExtension;
    interface = deviceExtension->UsbInterface;

    for (i=0; i<interface->NumberOfPipes; i++) {
        PipeInfo =  &interface->Pipes[i]; // PUSBD_PIPE_INFORMATION  PipeInfo;

        if ( PipeInfo->PipeFlags ) {
            USBLS120_KdPrint( DBGLVL_HIGH,("USBLS120_AbortPipes() Aborting open  Pipe %d\n", i));

            urb = USBLS120_ExAllocatePool(NonPagedPool, sizeof(struct _URB_PIPE_REQUEST));

            if (urb) {
                urb->UrbHeader.Length = (USHORT) sizeof (struct _URB_PIPE_REQUEST);
                urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE;
                urb->UrbPipeRequest.PipeHandle = PipeInfo->PipeHandle;

                ntStatus = USBLS120_CallUSBD(DeviceObject, urb);

                USBLS120_ExFreePool(urb);

            }
            else {
                ntStatus = STATUS_INSUFFICIENT_RESOURCES;
                USBLS120_KdPrint( DBGLVL_HIGH,("USBLS120_AbortPipes() FAILED urb alloc\n" ));
                break;
            }


            if (!(NT_SUCCESS(ntStatus))) {
                // if we failed, dump out
#if DBG
                if ( gpDbg )
                    gpDbg->PipeErrorCount++;
#endif
                break;
            }
            else {
                PipeInfo->PipeFlags = FALSE; // mark the pipe 'closed'
                deviceExtension->OpenPipeCount--;
#if DBG
                if ( gpDbg )
                    gpDbg->AbortPipeCount++;
#endif
            }

        } // end, if pipe open
    } // end, for all pipes

    return ntStatus;
}


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩在线不卡| 粉嫩av一区二区三区在线播放| 91官网在线观看| 一区二区不卡在线视频 午夜欧美不卡在| 不卡电影一区二区三区| 综合久久给合久久狠狠狠97色| 91小宝寻花一区二区三区| 亚洲欧美成aⅴ人在线观看| 欧美日韩精品免费| 精品亚洲成a人| 亚洲天堂网中文字| 91精品国产乱码| 国产成人综合亚洲91猫咪| 亚洲色图在线看| 久久久精品人体av艺术| 波多野结衣中文字幕一区 | 国产日本欧美一区二区| 99精品视频一区| 天天综合网天天综合色| 久久久久久免费毛片精品| 91网站在线观看视频| 老司机精品视频一区二区三区| 国产蜜臀av在线一区二区三区| 色香蕉成人二区免费| 日本欧美一区二区三区| 国产精品久久久久久久久久久免费看 | 视频一区在线播放| 国产午夜亚洲精品不卡| 日韩一级完整毛片| 岛国一区二区三区| 日本不卡一二三区黄网| 国产精品久久免费看| 欧美一区二区三区的| 99免费精品在线| 激情成人午夜视频| 一区二区成人在线视频| 国产欧美综合在线| 3d动漫精品啪啪一区二区竹菊 | 自拍偷拍欧美精品| 亚洲精品一区二区三区香蕉| 欧美中文字幕一区| 高清不卡一二三区| 激情久久五月天| 日韩精品久久久久久| 亚洲乱码国产乱码精品精可以看 | 亚洲自拍偷拍麻豆| 欧美国产日本韩| 精品久久人人做人人爱| 久久久一区二区| 67194成人在线观看| 一本久久综合亚洲鲁鲁五月天| 久久99蜜桃精品| 婷婷综合另类小说色区| 亚洲美女免费在线| 国产精品福利一区| 欧美极品少妇xxxxⅹ高跟鞋| 精品国产一二三| 欧美老年两性高潮| 欧美亚洲日本国产| 色婷婷激情综合| 99国产精品一区| av激情综合网| 99国产精品视频免费观看| 国产成人av电影免费在线观看| 久久99精品国产.久久久久久| 三级久久三级久久久| 午夜日韩在线电影| 五月婷婷色综合| 午夜精品福利视频网站| 亚洲午夜精品17c| 亚洲一区中文日韩| 免费在线观看一区| 美女国产一区二区三区| 美国三级日本三级久久99| 奇米777欧美一区二区| 男女性色大片免费观看一区二区| 日日摸夜夜添夜夜添国产精品| 亚洲v日本v欧美v久久精品| 亚洲成人免费视频| 午夜影视日本亚洲欧洲精品| 午夜欧美视频在线观看| 日韩电影在线一区| 久久精品国产**网站演员| 欧美日韩国产一区二区三区地区| 欧美视频在线播放| 91精品国产手机| 精品国产一区二区三区久久影院| 欧美精品一区二区三区高清aⅴ | 337p日本欧洲亚洲大胆精品| 亚洲精品一区二区三区在线观看 | 久久亚洲精精品中文字幕早川悠里| 国产精品毛片高清在线完整版| 国产欧美日韩久久| 亚洲久本草在线中文字幕| 亚洲国产毛片aaaaa无费看 | 久久久久久久久一| 日韩伦理免费电影| 天天影视涩香欲综合网| 日韩一区二区三| 久久久精品免费观看| 一区二区三区日本| 蜜臀国产一区二区三区在线播放 | 国内久久精品视频| av网站一区二区三区| 欧美色网一区二区| 久久女同性恋中文字幕| 亚洲免费观看视频| 裸体健美xxxx欧美裸体表演| 国产成人午夜电影网| 欧美三级乱人伦电影| 精品不卡在线视频| 一个色妞综合视频在线观看| 蜜臀av一区二区在线观看| 成人动漫一区二区三区| xnxx国产精品| 亚洲老妇xxxxxx| 激情综合色播激情啊| 色视频欧美一区二区三区| 日韩欧美在线一区二区三区| 久久久久国产精品人| 亚洲国产欧美一区二区三区丁香婷| 国内精品视频一区二区三区八戒| www.在线欧美| 精品久久人人做人人爽| 亚洲一级二级三级在线免费观看| 国产一区二区免费在线| 欧美私模裸体表演在线观看| 国产欧美日韩综合精品一区二区| 午夜电影网亚洲视频| 不卡av电影在线播放| 精品国产乱子伦一区| 亚洲最新在线观看| 不卡的av在线播放| 欧美日韩一区在线| 99re这里都是精品| 久久欧美中文字幕| 日韩av电影免费观看高清完整版| 成人av免费在线播放| 欧美精品一区二区三区很污很色的| 亚洲尤物视频在线| 99精品视频中文字幕| 国产日韩精品一区二区三区在线| 奇米精品一区二区三区在线观看 | 国产精品视频线看| 国内精品自线一区二区三区视频| 欧美日韩国产首页| 亚洲愉拍自拍另类高清精品| av成人动漫在线观看| 久久久久久影视| 韩国v欧美v亚洲v日本v| 日韩免费观看高清完整版| 日韩av网站在线观看| 欧美久久一区二区| 天堂精品中文字幕在线| 在线观看三级视频欧美| 亚洲精品日韩一| 91视频观看免费| 亚洲精品欧美在线| 在线观看亚洲一区| 蜜臀久久99精品久久久久久9| 在线观看一区二区视频| 亚洲欧美另类综合偷拍| 91视频在线观看免费| 综合久久久久综合| 日本精品裸体写真集在线观看| 亚洲欧美怡红院| 色中色一区二区| 亚洲精品菠萝久久久久久久| 99久久精品国产毛片| 亚洲视频一区在线观看| 99免费精品在线观看| 亚洲美女视频在线| 欧美日本一区二区三区四区| 天天综合日日夜夜精品| 欧美电影免费观看高清完整版在线| 久久狠狠亚洲综合| 国产亚洲va综合人人澡精品| 丁香天五香天堂综合| 亚洲欧美电影一区二区| 欧美日韩一级片网站| 老司机精品视频线观看86| 久久先锋资源网| 成人app下载| 亚洲国产成人高清精品| 91精品国产综合久久婷婷香蕉| 久久99热狠狠色一区二区| 欧美激情综合网| 欧美日免费三级在线| 国产99久久精品| 一区二区三区免费网站| 欧美大白屁股肥臀xxxxxx| 国产精品一区二区不卡| 一区二区三区四区视频精品免费| 欧美精品视频www在线观看| 久久99久久99精品免视看婷婷| 国产精品卡一卡二| 欧美日韩一二区| 国产精品白丝jk黑袜喷水| 亚洲影视在线播放| 久久你懂得1024|