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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? datapkt.c

?? a sample WDM stream class video capture driver that supports two IEEE 1394 digital cameras. The sam
?? C
?? 第 1 頁 / 共 3 頁
字號:
            }
            IsochDescriptorReserved->Flags |= STATE_DETACHING_BUFFERS;
            KeReleaseSpinLock(&pDevExt->IsochDescriptorLock, oldIrql);

            IsochDescriptor = (PISOCH_DESCRIPTOR) (((PUCHAR) IsochDescriptorReserved) - FIELDOFFSET(ISOCH_DESCRIPTOR, DeviceReserved[0]));

            pIrp = (PIRP) IsochDescriptor->DeviceReserved[5];
            ASSERT(pIrp);
            pIrb = (PIRB) IsochDescriptor->DeviceReserved[6];
            ASSERT(pIrb);


            DbgMsg1(("DCamReSubmitPacket: detaching IsochDescriptor %x IsochDescriptorReserved %x, pSrb %x\n",
                        IsochDescriptor, IsochDescriptorReserved, IsochDescriptorReserved->Srb));

#if DBG
            // Should not have been detached
            ASSERT((IsochDescriptor->DeviceReserved[7] == 0x87654321));
            IsochDescriptor->DeviceReserved[7]++;
#endif
            pIrb->FunctionNumber           = REQUEST_ISOCH_DETACH_BUFFERS;
            pIrb->Flags                    = 0;
            pIrb->u.IsochDetachBuffers.hResource = hStaleResource;
            pIrb->u.IsochDetachBuffers.nNumberOfDescriptors = 1;
            pIrb->u.IsochDetachBuffers.pIsochDescriptor = IsochDescriptor;

            NextIrpStack = IoGetNextIrpStackLocation(pIrp);
            NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
            NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_1394_CLASS;
            NextIrpStack->Parameters.Others.Argument1 = pIrb;

            IoSetCompletionRoutine(
                pIrp,
                DCamReSubmitPacketCR,
                IsochDescriptor,
                TRUE,
                TRUE,
                TRUE
                );

            Status =
                IoCallDriver(
                    pDevExt->BusDeviceObject,
                    pIrp
                    );

            ASSERT(Status == STATUS_SUCCESS || Status == STATUS_PENDING);

        } else {
            ERROR_LOG(("PendingCount %d, but list is empty!!\n", cntPendingRead));
            ASSERT(cntPendingRead == 0);
        }

    }  // for()

    return Status;
}



VOID
DCamReadStreamWorker(
    IN PHW_STREAM_REQUEST_BLOCK pSrb,
    IN PISOCH_DESCRIPTOR IsochDescriptor
    )

/*++

Routine Description:

    Does most of the work for handling reads via Attach buffers

Arguments:

    Srb - Pointer to Stream request block

    IsochDescriptor - Pointer to IsochDescriptor to be used

Return Value:

    Nothing

--*/

{

    PIRB pIrb;
    PIRP pIrp;
    PIO_STACK_LOCATION NextIrpStack;
    PDCAM_EXTENSION pDevExt;
    PISOCH_DESCRIPTOR_RESERVED IsochDescriptorReserved;
    NTSTATUS Status;


    pDevExt = (PDCAM_EXTENSION) pSrb->HwDeviceExtension;
    pIrp = (PIRP) IsochDescriptor->DeviceReserved[5];
    ASSERT(pIrp);
    pIrb = (PIRB) IsochDescriptor->DeviceReserved[6];
    ASSERT(pIrb);
#if DBG
    // track number time the same IsochDescriptor are attaching; should only be one.
    IsochDescriptor->DeviceReserved[4]++;
#endif

    //
    // It is pending and will be completed in isoch callback or cancelled.
    //

    pSrb->Status = STATUS_PENDING;

    IsochDescriptorReserved = (PISOCH_DESCRIPTOR_RESERVED) &IsochDescriptor->DeviceReserved[0];

    DbgMsg3(("\'DCamReadStreamWorker: enter with pSrb = %x, pDevExt=0x%x\n", pSrb, pDevExt));

    //
    // Attach descriptor onto our pending descriptor list
    //

    ExInterlockedInsertTailList(
       &pDevExt->IsochDescriptorList,
       &IsochDescriptorReserved->DescriptorList,
       &pDevExt->IsochDescriptorLock
       );

    pIrb->FunctionNumber           = REQUEST_ISOCH_ATTACH_BUFFERS;
    pIrb->Flags                    = 0;
    pIrb->u.IsochAttachBuffers.hResource = pDevExt->hResource;
    pIrb->u.IsochAttachBuffers.nNumberOfDescriptors = 1;
    pIrb->u.IsochAttachBuffers.pIsochDescriptor = IsochDescriptor;

    NextIrpStack = IoGetNextIrpStackLocation(pIrp);
    NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_1394_CLASS;
    NextIrpStack->Parameters.Others.Argument1 = pIrb;


    IoSetCompletionRoutine(
        pIrp,
        DCamAttachBufferCR,
        IsochDescriptor,
        TRUE,
        TRUE,
        TRUE
        );

    Status =
        IoCallDriver(
            pDevExt->BusDeviceObject,
            pIrp
            );

    ASSERT(Status == STATUS_SUCCESS || Status == STATUS_PENDING);

    return;  // Complete Asynchronously in IoCompletionRoutine*
}




VOID
DCamReadStream(
    IN PHW_STREAM_REQUEST_BLOCK Srb
    )

/*++

Routine Description:

    Called when an Read Data Srb request is received

Arguments:

    Srb - Pointer to Stream request block

Return Value:

    Nothing

--*/

{

    PIRB pIrb;
    PIRP pIrp;
    KIRQL oldIrql;
    PDCAM_EXTENSION pDevExt;
    PSTREAMEX     pStrmEx;
    PISOCH_DESCRIPTOR IsochDescriptor;
    PISOCH_DESCRIPTOR_RESERVED IsochDescriptorReserved;
    NTSTATUS StatusWait;


    pIrb = (PIRB) Srb->SRBExtension;
    pDevExt = (PDCAM_EXTENSION) Srb->HwDeviceExtension;
    ASSERT(pDevExt != NULL);



    pStrmEx = (PSTREAMEX) pDevExt->pStrmEx;
    ASSERT(pStrmEx);

    if(pDevExt->bDevRemoved ||
       pStrmEx == NULL) {

        Srb->Status = pDevExt->bDevRemoved ? STATUS_DEVICE_REMOVED : STATUS_UNSUCCESSFUL;
        Srb->ActualBytesTransferred = 0;
        Srb->CommandData.DataBufferArray->DataUsed = 0;
        ERROR_LOG(("DCamReadStream: Failed with Status %x or pStrmEx %x\n", Srb->Status, pStrmEx));

        StreamClassStreamNotification(StreamRequestComplete, Srb->StreamObject, Srb);
        return;
    }

    //
    // Mutext for either StreamIo (SRB_READ) ControlIo (SRB_SET_STREAM_STATE)
    //
    // Non-alertable; wait infinite

    StatusWait = KeWaitForSingleObject( &pStrmEx->hMutex, Executive, KernelMode, FALSE, 0 );
    ASSERT(StatusWait == STATUS_SUCCESS);

    DbgMsg3(("\'%d:%s) DCamReadStream: enter with Srb %x, DevExt %x\n",
            pDevExt->idxDev, pDevExt->pchVendorName, Srb, pDevExt));


    // Rule:
    // Only accept read requests when in either the Pause or Run
    // States.  If Stopped, immediately return the SRB.

    if (pStrmEx->KSState == KSSTATE_STOP ||
        pStrmEx->KSState == KSSTATE_ACQUIRE) {

        DbgMsg2(("\'%d:%s)DCamReadStream: Current KSState(%d) < (%d)=KSSTATE_PAUSE; Srb=0x%x; DevExt=0x%x",
                 pDevExt->idxDev, pDevExt->pchVendorName, pStrmEx->KSState,  KSSTATE_PAUSE, Srb, pDevExt));

        DbgMsg2(("\'DCamReadStream: PendingRead=%d, IsochDescriptorList(%s)\n",
              pDevExt->PendingReadCount, IsListEmpty(&pDevExt->IsochDescriptorList)?"Empty":"!Empty"));

        Srb->Status = STATUS_UNSUCCESSFUL;
        Srb->CommandData.DataBufferArray->DataUsed = 0;
        StreamClassStreamNotification(StreamRequestComplete, Srb->StreamObject, Srb);

        KeReleaseMutex(&pStrmEx->hMutex, FALSE);

        return;
    }


    // Buffer need to be big enough
    if (IsochInfoTable[pStrmEx->idxIsochTable].CompletePictureSize > Srb->CommandData.DataBufferArray->FrameExtent) {

        ASSERT(IsochInfoTable[pStrmEx->idxIsochTable].CompletePictureSize <= Srb->CommandData.DataBufferArray->FrameExtent);
        Srb->Status = STATUS_INVALID_PARAMETER;
        StreamClassStreamNotification(StreamRequestComplete, Srb->StreamObject, Srb);

        KeReleaseMutex(&pStrmEx->hMutex, FALSE);

        return;
    }


    //
    // Use our own IRP
    //
    pIrp = IoAllocateIrp(pDevExt->BusDeviceObject->StackSize, FALSE);
    if(!pIrp) {
        ASSERT(pIrp);
        Srb->Status = STATUS_INSUFFICIENT_RESOURCES;
        return;
    }

    //
    // This structure (IsochDescriptor) has (ULONG) DeviceReserved[8];
    // Its first 4 ULONGs are used by IsochDescriptorReserved,
    // The 6th (index[5]), is used to keep pIrp
    //     7th (index[6]), is used to keep pIrb
    //

    IsochDescriptor = ExAllocatePoolWithTag(NonPagedPool, sizeof(ISOCH_DESCRIPTOR), 'macd');
    if (!IsochDescriptor) {

        ASSERT(FALSE);
        Srb->Status = STATUS_INSUFFICIENT_RESOURCES;
        StreamClassStreamNotification(StreamRequestComplete, Srb->StreamObject, Srb);

        KeReleaseMutex(&pStrmEx->hMutex, FALSE);

        return;
    }


    DbgMsg3(("\'DCamReadStream: IsochDescriptor = %x\n", IsochDescriptor));
    IsochDescriptor->fulFlags = SYNCH_ON_SY;

    DbgMsg3(("\'DCamReadStream: Incoming Mdl = %x\n", Srb->Irp->MdlAddress));
    IsochDescriptor->Mdl = Srb->Irp->MdlAddress;

    // Use size match what we originally requested in AllocateIsoch
    IsochDescriptor->ulLength = IsochInfoTable[pStrmEx->idxIsochTable].CompletePictureSize;
    IsochDescriptor->nMaxBytesPerFrame = IsochInfoTable[pStrmEx->idxIsochTable].QuadletPayloadPerPacket << 2;

    IsochDescriptor->ulSynch = START_OF_PICTURE;
    IsochDescriptor->ulTag = 0;
    IsochDescriptor->Callback = DCamIsochCallback;
    IsochDescriptor->Context1 = pDevExt;
    IsochDescriptor->Context2 = IsochDescriptor;

    //
    // IsochDescriptorReserved is pointed to the DeviceReserved[0];
    // The entire, except the links, are kept in the DeviceReserved[]
    //

    IsochDescriptorReserved = (PISOCH_DESCRIPTOR_RESERVED) &IsochDescriptor->DeviceReserved[0];
    IsochDescriptorReserved->Srb = Srb;
    IsochDescriptorReserved->Flags = 0;

    IsochDescriptor->DeviceReserved[5] = (ULONG_PTR) pIrp;
    IsochDescriptor->DeviceReserved[6] = (ULONG_PTR) pIrb;

#if DBG
    //
    // Put signatures and use these count to track if the IsochDescriptor
    // has been attached or detached unexpectely.
    //
    // When attach, [4]++  (DCamReadStreamWorker(), DCamReSumbitPacketCR())
    //      detach, [7]++  (DCamIsochcallback(), DCamCancelPacketCR(), DCamResubmitPacket())
    //

    IsochDescriptor->DeviceReserved[4] = 0x12345678;
    IsochDescriptor->DeviceReserved[7] = 0x87654321;
#endif

    //
    // Checking here to see if we have enuff resources to put this read
    // down right away.  Since we only allocated N amount of resources
    // from the 1394 stack beneath us, we'll have to stay within that
    // limit and do some of the throttling ourself.
    //

    KeAcquireSpinLock(&pDevExt->IsochWaitingLock, &oldIrql);
    if (InterlockedIncrement(&pDevExt->PendingReadCount) > MAX_BUFFERS_SUPPLIED) {

        //
        // don't have enuff resources to do an attach buffers right now.
        // we'll queue this request and pull it off later when another
        // read completes.
        //

        DbgMsg2(("\'DCamReadStream: Queueing request - Read Count = %x\n", pDevExt->PendingReadCount));
        InsertTailList(
           &pDevExt->IsochWaitingList,
           &IsochDescriptorReserved->DescriptorList
           );

        KeReleaseSpinLock(&pDevExt->IsochWaitingLock, oldIrql);

        KeReleaseMutex(&pStrmEx->hMutex, FALSE);

        return;

    }

    if(pStrmEx->KSState == KSSTATE_PAUSE) {
        DbgMsg2(("\'DCamReadStream: Doing Pre-read in _PAUSE state; Srb %x, pDevExt %x, PendingCount %d\n",
                 Srb, pDevExt, pDevExt->PendingReadCount));
    }

    //
    // Do actual read work here via our Read worker function
    //

    KeReleaseSpinLock(&pDevExt->IsochWaitingLock, oldIrql);
    DCamReadStreamWorker(Srb, IsochDescriptor);

    KeReleaseMutex(&pStrmEx->hMutex, FALSE);

}

VOID
DCamReceiveDataPacket(
    IN PHW_STREAM_REQUEST_BLOCK Srb
    )

/*++

Routine Description:

    Called with video data packet commands

Arguments:

    Srb - Pointer to Stream request block

Return Value:

    Nothing

--*/

{
    PAGED_CODE();

    //
    // determine the type of packet.
    //

    switch (Srb->Command) {

    case SRB_READ_DATA:

         DbgMsg3(("\'DCamReceiveDataPacket: SRB_READ_DATA\n"));
         DCamReadStream(Srb);

         // This request will be completed asynchronously...

         break;

    case SRB_WRITE_DATA:

         DbgMsg3(("\'DCamReceiveDataPacket: SRB_WRITE_DATA, not used for digital camera.\n"));
         ASSERT(FALSE);

    default:

         //
         // invalid / unsupported command. Fail it as such
         //

         Srb->Status = STATUS_NOT_IMPLEMENTED;

         StreamClassStreamNotification(StreamRequestComplete, Srb->StreamObject, Srb);

    }

}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆国产福利在线观看| 成人午夜免费av| 国产自产v一区二区三区c| av高清久久久| 日韩视频免费观看高清在线视频| 亚洲欧美自拍偷拍色图| 蜜桃视频第一区免费观看| av电影在线观看不卡| ww久久中文字幕| 亚洲一区二区三区国产| 成年人国产精品| 2024国产精品| 美女视频第一区二区三区免费观看网站| 成人av综合在线| 国产丝袜美腿一区二区三区| 日本欧美肥老太交大片| 欧美主播一区二区三区美女| 国产精品免费av| 粉嫩aⅴ一区二区三区四区五区| 欧美一级一区二区| 午夜精品在线视频一区| 91片在线免费观看| 中文字幕在线观看不卡视频| 国产福利一区二区| 欧美aaaaaa午夜精品| 欧美性受xxxx黑人xyx性爽| 中文字幕在线一区二区三区| 成人性生交大片免费看中文| 国产午夜亚洲精品午夜鲁丝片| 美女网站在线免费欧美精品| 欧美一区二区三区在线观看| 天天色综合天天| 91精品国产综合久久久久久漫画| 在线亚洲欧美专区二区| gogogo免费视频观看亚洲一| 精品少妇一区二区三区免费观看 | 国产精品理伦片| 国产**成人网毛片九色| 精品免费视频.| 麻豆成人免费电影| 2023国产精品| 国产黄色精品网站| 国产精品系列在线| 成人avav在线| 有坂深雪av一区二区精品| 色婷婷久久久久swag精品| 一区二区三国产精华液| 欧美视频第二页| 青青国产91久久久久久| 日韩欧美成人一区二区| 国产乱子伦视频一区二区三区| 国产三级精品在线| 欧美一卡2卡3卡4卡| 日本成人在线视频网站| 欧美一二区视频| 国产夫妻精品视频| 国产精品久久久爽爽爽麻豆色哟哟| 91麻豆免费观看| 亚洲aaa精品| 久久欧美一区二区| 成人免费高清在线观看| 一区二区三区不卡在线观看 | 国产精品亚洲一区二区三区妖精 | 樱桃国产成人精品视频| 欧美日本韩国一区二区三区视频| 免费看欧美女人艹b| 欧美国产97人人爽人人喊| 色婷婷综合久久久中文字幕| 麻豆91在线观看| 亚洲视频在线观看三级| 国产永久精品大片wwwapp| 久久久一区二区三区| 一本高清dvd不卡在线观看 | 国产无一区二区| 色视频一区二区| 国产一区二区三区av电影| 亚洲欧美日韩国产中文在线| 日韩精品一区二区三区视频 | 精品国产成人系列| 91首页免费视频| 久久不见久久见免费视频1| 国产精品久久久久久亚洲毛片| 777精品伊人久久久久大香线蕉| 国产黑丝在线一区二区三区| 亚洲不卡在线观看| 国产精品天天看| 精品久久久三级丝袜| 色哟哟精品一区| 国产91精品欧美| 青青青伊人色综合久久| 一区二区三区精品| 欧美激情在线观看视频免费| 欧美一区二区三区日韩视频| 91麻豆国产在线观看| 国产成人亚洲综合a∨婷婷| 日韩av网站在线观看| 亚洲一区二区三区国产| 亚洲欧洲一区二区在线播放| 亚洲精品一区二区三区99| 欧美丰满一区二区免费视频| 91麻豆国产香蕉久久精品| 成人动漫av在线| 国产成人精品免费在线| 国产原创一区二区| 男女男精品视频网| 亚洲成a人v欧美综合天堂 | 国产精品一区二区免费不卡| 中文字幕一区二区5566日韩| 精品国产一区二区三区四区四| 欧美日韩国产一区二区三区地区| 色婷婷一区二区三区四区| 成人黄色小视频在线观看| 国产成a人亚洲精品| 国产黑丝在线一区二区三区| 国产伦精品一区二区三区视频青涩| 伦理电影国产精品| 精品制服美女丁香| 激情深爱一区二区| 国产剧情一区二区| 精品国产乱码久久久久久免费| 日韩一区二区三区免费看| 日韩精品在线看片z| 精品奇米国产一区二区三区| 精品国产乱码久久久久久1区2区| 日韩欧美国产综合在线一区二区三区| 欧美一区二区免费观在线| 日韩欧美电影一区| 久久久精品免费观看| 欧美激情资源网| 综合精品久久久| 亚洲伊人伊色伊影伊综合网| 天堂成人免费av电影一区| 免费人成网站在线观看欧美高清| 九九在线精品视频| 国产成人在线免费| 91小视频在线| 欧美日韩视频在线第一区| 日韩免费观看高清完整版在线观看| 日韩欧美电影在线| 国产精品入口麻豆九色| 亚洲精品乱码久久久久| 日韩不卡免费视频| 国产福利精品一区二区| 色久优优欧美色久优优| 制服丝袜亚洲色图| 久久精品一区二区| 一区二区三区在线观看视频| 日本伊人午夜精品| 国产成人在线观看| 欧美视频日韩视频| 久久久久99精品国产片| 亚洲精品综合在线| 久久国产欧美日韩精品| www.亚洲国产| 国产精品理论在线观看| 91免费观看视频在线| 欧美最新大片在线看| 91精品福利在线一区二区三区| 欧美精品一区二区三区四区 | 国产精品一二三区在线| 色噜噜狠狠成人中文综合 | 在线观看av一区| 精品国产乱码久久| 亚洲激情图片小说视频| 国内精品嫩模私拍在线| 日本韩国欧美三级| 国产午夜亚洲精品理论片色戒 | 日本一区二区三区dvd视频在线| 一区二区三区在线视频播放| 国产在线播放一区二区三区 | 福利电影一区二区三区| 在线视频一区二区三区| 久久久影院官网| 亚洲第一主播视频| 91网上在线视频| 久久精品日韩一区二区三区| 图片区小说区国产精品视频| 成人av在线资源网站| 2023国产精品自拍| 日韩av成人高清| 欧美日韩国产首页| 一区二区三区中文字幕电影| 国产999精品久久久久久| 欧美草草影院在线视频| 视频在线观看国产精品| 在线亚洲免费视频| 亚洲视频小说图片| 成人av网站在线观看免费| 久久综合狠狠综合| 另类的小说在线视频另类成人小视频在线 | 捆绑变态av一区二区三区| 欧美日韩国产综合一区二区| 一级精品视频在线观看宜春院 | 国产精品久久久久久久久久免费看 | 欧美韩日一区二区三区| 国产一区二区91| 精品久久久久一区| 韩国成人在线视频| 精品国产一区二区三区四区四| 久久99久久99精品免视看婷婷 |