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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? diskperf.c

?? U盤(pán)過(guò)濾驅(qū)動(dòng),仿DDK例子diskperf改寫(xiě),實(shí)現(xiàn)U盤(pán)的只讀操作,供初學(xué)者參考
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
    UNREFERENCED_PARAMETER(Context);

    //
    // Get the per processor partition counters
    // NOTE: DiskPerfReadWrite already check to see if this buffer is NON
    // NULL before scheduling this completion routine, so we assume that it
    // is always non-NULL when we get here
    //

    partitionCounters = (PDISK_PERFORMANCE)
                        ((PCHAR) deviceExtension->DiskCounters
                             + ((ULONG)KeGetCurrentProcessorNumber()
                                * PROCESSOR_COUNTERS_SIZE));
    //
    // Time stamp current request complete.
    //

    if (partitionCounters == NULL) {    // just in case
        return STATUS_SUCCESS;
    };
    difference = (PLARGE_INTEGER) &irpStack->Parameters.Read;
    DiskPerfGetClock(timeStampComplete, NULL);
    difference->QuadPart = timeStampComplete.QuadPart - difference->QuadPart;
    DBGOUT((10, "DiskPerfIoCompletion: TS=%I64u diff %I64u\n",
                     timeStampComplete, difference->QuadPart));

    //
    // Decrement the queue depth counters for the volume.  This is
    // done without the spinlock using the Interlocked functions.
    // This is the only
    // legal way to do this.
    //

    queueLen = InterlockedDecrement(&deviceExtension->QueueDepth);

    if (queueLen < 0) { // do not over-decrement. Only happens at start
        queueLen = InterlockedIncrement(&deviceExtension->QueueDepth);
    }
    if (queueLen == 0) {
        deviceExtension->LastIdleClock = timeStampComplete;
    }

    //
    // Update counters
    //

    if (irpStack->MajorFunction == IRP_MJ_READ) {

        //
        // Add bytes in this request to bytes read counters.
        //

        partitionCounters->BytesRead.QuadPart += Irp->IoStatus.Information;

        //
        // Increment read requests processed counters.
        //

        partitionCounters->ReadCount++;

        //
        // Calculate request processing time.
        //

        partitionCounters->ReadTime.QuadPart += difference->QuadPart;
        DBGOUT((11, "Added RT delta %I64u total %I64u qlen=%d\n",
            difference->QuadPart, partitionCounters->ReadTime.QuadPart,
            queueLen));


		DbgPrint(("讀操作 diskperf.c\n"));

    }

    else {

		// 寫(xiě)操作

        //
        // Add bytes in this request to bytes write counters.
        //

        partitionCounters->BytesWritten.QuadPart += Irp->IoStatus.Information;
        //
        // Increment write requests processed counters.
        //

       // partitionCounters->WriteCount++;

        //
        // Calculate request processing time.
        //

        partitionCounters->WriteTime.QuadPart += difference->QuadPart;
        DBGOUT((11, "Added WT delta %I64u total %I64u qlen=%d\n",
            difference->QuadPart, partitionCounters->WriteTime.QuadPart,
            queueLen));


		DbgPrint(("寫(xiě)操作 diskperf.c\n"));


    }

    if (Irp->Flags & IRP_ASSOCIATED_IRP) {
        partitionCounters->SplitCount++;
    }

    if (Irp->PendingReturned) {
        IoMarkIrpPending(Irp);
    }
    return STATUS_SUCCESS;

} // DiskPerfIoCompletion


NTSTATUS
DiskPerfDeviceControl(
    PDEVICE_OBJECT DeviceObject,
    PIRP Irp
    )

/*++

Routine Description:

    This device control dispatcher handles only the disk performance
    device control. All others are passed down to the disk drivers.
    The disk performane device control returns a current snapshot of
    the performance data.

Arguments:

    DeviceObject - Context for the activity.
    Irp          - The device control argument block.

Return Value:

    Status is returned.

--*/

{
    PDEVICE_EXTENSION  deviceExtension = DeviceObject->DeviceExtension;
    PIO_STACK_LOCATION currentIrpStack = IoGetCurrentIrpStackLocation(Irp);

    DBGOUT((2, "DiskPerfDeviceControl: DeviceObject %X Irp %X\n",
                    DeviceObject, Irp));


	if( currentIrpStack->Parameters.DeviceIoControl.IoControlCode == 
		DISK_READONLY )
	{
		// 
		IsReadOnly = TRUE;
		Irp->IoStatus.Status = STATUS_SUCCESS;
		Irp->IoStatus.Information = 0;
		IoCompleteRequest(Irp, IO_NO_INCREMENT);

		DbgPrint(("My Ioctrl DISK_READONLY \n"));

		return STATUS_SUCCESS;
	}

	if( currentIrpStack->Parameters.DeviceIoControl.IoControlCode == 
		DISK_NONREADONLY )
	{
		// 
		IsReadOnly = FALSE;
		Irp->IoStatus.Status = STATUS_SUCCESS;
		Irp->IoStatus.Information = 0;
		IoCompleteRequest(Irp, IO_NO_INCREMENT);

		DbgPrint(("My Ioctrl DISK_NONREADONLY \n"));

		return STATUS_SUCCESS;
	}

    if (currentIrpStack->Parameters.DeviceIoControl.IoControlCode ==
        IOCTL_DISK_PERFORMANCE) {

        NTSTATUS        status;
        KIRQL     currentIrql;

        //
        // Verify user buffer is large enough for the performance data.
        //

        if (currentIrpStack->Parameters.DeviceIoControl.OutputBufferLength <
                sizeof(DISK_PERFORMANCE)) {

        //
        // Indicate unsuccessful status and no data transferred.
        //

        status = STATUS_BUFFER_TOO_SMALL;
        Irp->IoStatus.Information = 0;

        }

        else {
            ULONG i;
            PDISK_PERFORMANCE totalCounters;
            PDISK_PERFORMANCE diskCounters = deviceExtension->DiskCounters;
            LARGE_INTEGER frequency, perfctr;

            if (diskCounters == NULL) {
                Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
                IoCompleteRequest(Irp, IO_NO_INCREMENT);
                return STATUS_UNSUCCESSFUL;
            }

            if (InterlockedCompareExchange(&deviceExtension->EnabledAlways, 1, 0) == 0)
            {
                InterlockedIncrement(&deviceExtension->CountersEnabled);

                //
                // reset per processor counters only
                //
                if (deviceExtension->DiskCounters != NULL)
                {
                    RtlZeroMemory(deviceExtension->DiskCounters, PROCESSOR_COUNTERS_SIZE * deviceExtension->Processors);
                }

                DiskPerfGetClock(deviceExtension->LastIdleClock, NULL);

                deviceExtension->QueueDepth = 0;

                DBGOUT((10, "DiskPerfDeviceControl: LIC=%I64u\n", deviceExtension->LastIdleClock));
                DBGOUT((3, "DiskPerfDeviceControl: Counters enabled %d\n", deviceExtension->CountersEnabled));
            }

            totalCounters = (PDISK_PERFORMANCE) Irp->AssociatedIrp.SystemBuffer;
            RtlZeroMemory(totalCounters, sizeof(DISK_PERFORMANCE));
#ifdef USE_PERF_CTR
            perfctr = KeQueryPerformanceCounter(&frequency);
#endif
            KeQuerySystemTime(&totalCounters->QueryTime);

            for (i=0; i<deviceExtension->Processors; i++) {
                DiskPerfAddCounters(totalCounters, diskCounters, frequency);
                diskCounters = (PDISK_PERFORMANCE)
                               ((PCHAR) diskCounters + PROCESSOR_COUNTERS_SIZE);
            }
            totalCounters->QueueDepth = deviceExtension->QueueDepth;

            if (totalCounters->QueueDepth == 0) {
                LARGE_INTEGER difference;

                difference.QuadPart =
#ifdef USE_PERF_CTR
                    perfctr.QuadPart
#else
                   totalCounters->QueryTime.QuadPart
#endif
                        - deviceExtension->LastIdleClock.QuadPart;
                if (difference.QuadPart > 0) {
                    totalCounters->IdleTime.QuadPart +=
#ifdef USE_PERF_CTR
                        10000000 * difference.QuadPart / frequency.QuadPart;
#else
                        difference.QuadPart;
#endif
                }
            }
            totalCounters->StorageDeviceNumber
                = deviceExtension->DiskNumber;
            RtlCopyMemory(
                &totalCounters->StorageManagerName[0],
                &deviceExtension->StorageManagerName[0],
                8 * sizeof(WCHAR));
            status = STATUS_SUCCESS;
            Irp->IoStatus.Information = sizeof(DISK_PERFORMANCE);
        }

        //
        // Complete request.
        //

        Irp->IoStatus.Status = status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return status;

    }

    else {

        //
        // Set current stack back one.
        //

        Irp->CurrentLocation++,
        Irp->Tail.Overlay.CurrentStackLocation++;

        //
        // Pass unrecognized device control requests
        // down to next driver layer.
        //

        return IoCallDriver(deviceExtension->TargetDeviceObject, Irp);
    }
} // end DiskPerfDeviceControl()



NTSTATUS DiskPerfWmi(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )

/*++

Routine Description:

    This routine handles any WMI requests for information. Since the disk
    information is read-only, is always collected and does not have any
    events only QueryAllData, QuerySingleInstance and GetRegInfo requests
    are supported.

Arguments:

    DeviceObject - Context for the activity.
    Irp          - The device control argument block.

Return Value:

    Status is returned.

--*/

{
    PIO_STACK_LOCATION      irpSp;
    NTSTATUS status;
    PWMILIB_CONTEXT wmilibContext;
    SYSCTL_IRP_DISPOSITION disposition;
    PDEVICE_EXTENSION  deviceExtension = DeviceObject->DeviceExtension;

    PAGED_CODE();

    DBGOUT((2, "DiskPerfWmi: DeviceObject %X Irp %X\n",
                    DeviceObject, Irp));
    wmilibContext = &deviceExtension->WmilibContext;
    if (wmilibContext->GuidCount == 0)  // wmilibContext is not valid
    {
        DBGOUT((3, "DiskPerfWmi: WmilibContext invalid"));
        return DiskPerfSendToNextDriver(DeviceObject, Irp);
    }

    irpSp = IoGetCurrentIrpStackLocation(Irp);

        DBGOUT((3, "DiskPerfWmi: Calling WmiSystemControl\n"));
        status = WmiSystemControl(wmilibContext,
                                    DeviceObject,
                                    Irp,
                                    &disposition);
        switch (disposition)
        {
            case IrpProcessed:
            {
                break;
            }

            case IrpNotCompleted:
            {
                IoCompleteRequest(Irp, IO_NO_INCREMENT);
                break;
            }

//          case IrpForward:
//          case IrpNotWmi:
            default:
            {
                status = DiskPerfSendToNextDriver(DeviceObject, Irp);
                break;
            }
        }
    return(status);

}


NTSTATUS
DiskPerfShutdownFlush(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )

/*++

Routine Description:

    This routine is called for a shutdown and flush IRPs.  These are sent by the
    system before it actually shuts down or when the file system does a flush.

Arguments:

    DriverObject - Pointer to device object to being shutdown by system.
    Irp          - IRP involved.

Return Value:

    NT Status

--*/

{
    PDEVICE_EXTENSION  deviceExtension = DeviceObject->DeviceExtension;

    //
    // Set current stack back one.
    //

    DBGOUT((2, "DiskPerfShutdownFlush: DeviceObject %X Irp %X\n",
                    DeviceObject, Irp));
    Irp->CurrentLocation++,
    Irp->Tail.Overlay.CurrentStackLocation++;

    return IoCallDriver(deviceExtension->TargetDeviceObject, Irp);

} // end DiskPerfShutdownFlush()


VOID
DiskPerfUnload(
    IN PDRIVER_OBJECT DriverObject
    )

/*++

Routine Description:

    Free all the allocated resources, etc.

Arguments:

    DriverObject - pointer to a driver object.

Return Value:

    VOID.

--*/
{
    PAGED_CODE();

    return;
}


NTSTATUS
DiskPerfRegisterDevice(
    IN PDEVICE_OBJECT DeviceObject
    )

/*++

Routine Description:

    Routine to initialize a proper name for the device object, and
    register it with WMI

Arguments:

    DeviceObject - pointer to a device object to be initialized.

Return Value:

    Status of the initialization. NOTE: If the registration fails,
    the device name in the DeviceExtension will be left as empty.

--*/

{
    NTSTATUS                status;
    IO_STATUS_BLOCK         ioStatus;
    KEVENT                  event;
    PDEVICE_EXTENSION       deviceExtension;
    PIRP                    irp;
    STORAGE_DEVICE_NUMBER   number;
    ULONG                   registrationFlag = 0;

    PAGED_CODE();

    DBGOUT((2, "DiskPerfRegisterDevice: DeviceObject %X\n",
                    DeviceObject));
    deviceExtension = DeviceObject->DeviceExtension;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久国产综合精品色伊| 97久久超碰国产精品| 伊人一区二区三区| 麻豆精品久久精品色综合| 在线观看av一区| 国产精品私人影院| 精品一区二区在线看| 欧美日韩黄色一区二区| 日韩欧美国产小视频| 91香蕉视频在线| 精品不卡在线视频| 性做久久久久久| 色系网站成人免费| 国产精品久久久久影院| 韩国v欧美v日本v亚洲v| 91精品国产欧美日韩| 亚洲与欧洲av电影| 色综合久久中文字幕综合网| 国产欧美日韩精品在线| 国内精品国产成人国产三级粉色| 欧美精品一二三四| 亚洲成人中文在线| 欧美三级电影网站| 亚洲最快最全在线视频| 91免费版pro下载短视频| 国产精品久久国产精麻豆99网站| 国产揄拍国内精品对白| 精品福利在线导航| 韩国三级中文字幕hd久久精品| 91精品国产福利| 日韩国产高清影视| 欧美二区乱c少妇| 天天爽夜夜爽夜夜爽精品视频| 色网综合在线观看| 一区二区三区精品久久久| 色婷婷国产精品久久包臀 | 欧美高清在线视频| 欧美成人乱码一区二区三区| 丝袜国产日韩另类美女| 欧美性感一区二区三区| 亚洲欧美偷拍另类a∨色屁股| 成人爱爱电影网址| 国产精品黄色在线观看| 91小视频在线免费看| 亚洲视频1区2区| 日本二三区不卡| 亚洲第一在线综合网站| 欧美三级电影精品| 日韩成人午夜电影| 精品久久免费看| 国产乱码精品1区2区3区| 久久精品夜色噜噜亚洲aⅴ| 国产成人av电影| 中文字幕亚洲综合久久菠萝蜜| 91色|porny| 亚洲gay无套男同| 日韩视频123| 国产精品系列在线观看| 国产精品入口麻豆九色| 日本高清不卡aⅴ免费网站| 午夜精品福利在线| 欧美本精品男人aⅴ天堂| 国产在线不卡一区| 亚洲欧洲精品成人久久奇米网| 色综合色综合色综合色综合色综合| 洋洋成人永久网站入口| 欧美精品九九99久久| 国产一区三区三区| 亚洲视频免费在线| 欧美肥大bbwbbw高潮| 国产精品一二三四| 亚洲男人天堂av网| 日韩一区二区在线看| 国产精品影音先锋| 亚洲美女在线一区| 欧美一区午夜视频在线观看| 国产麻豆91精品| 亚洲黄色片在线观看| 欧美一区二区三区四区视频| 丁香婷婷综合五月| 五月综合激情婷婷六月色窝| 久久色在线视频| 在线影视一区二区三区| 精品系列免费在线观看| 亚洲免费观看高清完整| 欧美一区二区精美| 成人动漫一区二区在线| 婷婷激情综合网| 中文字幕av一区二区三区高| 欧美日韩国产大片| 高清久久久久久| 日韩二区三区在线观看| 欧美激情一区二区三区在线| 欧美精品三级在线观看| 成人精品国产一区二区4080| 天堂久久久久va久久久久| 国产人妖乱国产精品人妖| 欧美日韩国产成人在线免费| 成人小视频在线| 蜜臀精品一区二区三区在线观看 | 日韩欧美卡一卡二| 97se亚洲国产综合自在线| 麻豆一区二区在线| 亚洲黄色av一区| 国产亚洲一区二区三区在线观看| 欧美日韩视频第一区| 成人黄动漫网站免费app| 免费的成人av| 亚洲一区二区欧美| 中文一区一区三区高中清不卡| 91精品在线观看入口| 99久久免费视频.com| 九九精品一区二区| 香港成人在线视频| 亚洲欧美日本韩国| 欧美激情在线看| 精品精品欲导航| 欧美日韩1234| 色哟哟一区二区在线观看| 国产精品性做久久久久久| 久久精品免费看| 亚洲国产另类av| 一区二区视频在线| 国产精品色噜噜| 国产亚洲精品免费| 精品国产免费一区二区三区四区| 欧美性感一区二区三区| 色域天天综合网| av激情成人网| 成人深夜在线观看| 国产成人亚洲综合a∨婷婷| 久草精品在线观看| 理论片日本一区| 蜜桃视频一区二区三区在线观看 | 久久精品一区二区三区av| 69av一区二区三区| 欧美日韩激情一区二区| 在线观看区一区二| 91国在线观看| 日本久久精品电影| 色吧成人激情小说| 色综合天天做天天爱| 99久久99久久久精品齐齐| 成人精品小蝌蚪| 成人ar影院免费观看视频| 国产69精品久久777的优势| 国产一区二区伦理片| 国产资源精品在线观看| 狠狠色丁香婷婷综合久久片| 久久国产婷婷国产香蕉| 久久99国产精品麻豆| 热久久久久久久| 麻豆精品视频在线观看免费| 久久精品久久久精品美女| 久久精品国产亚洲a| 看国产成人h片视频| 韩国成人福利片在线播放| 国产精品亚洲视频| 国产99久久久久| av福利精品导航| 91黄色免费版| 在线不卡免费欧美| 日韩欧美在线不卡| 26uuu精品一区二区三区四区在线| 精品久久久久久久久久久久久久久| 26uuu国产在线精品一区二区| 国产色91在线| 自拍偷拍国产精品| 亚洲一区视频在线| 日韩va亚洲va欧美va久久| 久久精品国产久精国产| 国产精品自拍网站| 91在线视频在线| 欧美色窝79yyyycom| 91精品国产乱| 久久久久久久电影| 亚洲四区在线观看| 香蕉久久一区二区不卡无毒影院| 三级影片在线观看欧美日韩一区二区| 日本在线不卡视频| 国产精品一二一区| 91在线无精精品入口| 在线成人av影院| 国产日韩欧美不卡| 亚洲女爱视频在线| 欧美aaaaa成人免费观看视频| 国产精品一区专区| 91免费观看国产| 日韩一区二区电影| 国产精品天美传媒沈樵| 一区二区三区**美女毛片| 午夜婷婷国产麻豆精品| 国模套图日韩精品一区二区| av资源网一区| 欧美精品日韩综合在线| 日本一区二区三区电影| 性久久久久久久久| 国产高清在线精品| 欧美吞精做爰啪啪高潮| 亚洲精品一区二区三区香蕉|