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

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

?? diskperf.c

?? U盤過濾驅動,仿DDK例子diskperf改寫,實現U盤的只讀操作,供初學者參考
?? C
?? 第 1 頁 / 共 5 頁
字號:

	irpStack = IoGetCurrentIrpStackLocation( Irp );

	CurSrb = (PSCSI_REQUEST_BLOCK)ExAllocatePoolWithTag(NonPagedPool,
		sizeof(SCSI_REQUEST_BLOCK),
		'brs');
	if (CurSrb == NULL) 
	{
		//DbgPrint("觀察:CurSrb==NULL\n");
	}
	else
	{
		//DbgPrint("觀察:CurSrb!=NULL\n");
	}

	RtlZeroMemory(CurSrb, SCSI_REQUEST_BLOCK_SIZE); 

	if (irpStack->MajorFunction==IRP_MJ_INTERNAL_DEVICE_CONTROL)
	{
		CurSrb=irpStack->Parameters.Scsi.Srb; 
		cdb = (PCDB)CurSrb->Cdb; 
		opCode=cdb->CDB6GENERIC.OperationCode; 
		if (opCode==SCSIOP_MODE_SENSE)
		{
			DbgPrint("觀察:進入U盤寫保護\n");
			modeData = (PMODE_PARAMETER_HEADER)CurSrb->DataBuffer;
			if( IsReadOnly )
			{
				DbgPrint("U盤寫保護\n");
				modeData->DeviceSpecificParameter |= MODE_DSP_WRITE_PROTECT;
			}
		} 
	}

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

	return Irp->IoStatus.Status ;
} 

NTSTATUS
DiskPerfScsi(
			 IN PDEVICE_OBJECT DeviceObject,
			 IN PIRP Irp
			 )
{


	NTSTATUS status; 
	KIRQL IrqLevel;

	PDEVICE_OBJECT pDeviceObject;


	PDEVICE_EXTENSION StorExtension = ( PDEVICE_EXTENSION )
		DeviceObject->DeviceExtension; 

	IoCopyCurrentIrpStackLocationToNext( Irp );

	IoSetCompletionRoutine( Irp,
		USBSCSICompletion,
		DeviceObject,
		TRUE,
		TRUE,
		TRUE ); 

	return IoCallDriver( StorExtension->TargetDeviceObject, Irp );

}

// 此函數行為及其功能暫不知道 孫勇
VOID
DiskPerfSyncFilterWithTarget(
    IN PDEVICE_OBJECT FilterDevice,
    IN PDEVICE_OBJECT TargetDevice
    )
{
    ULONG                   propFlags;

    PAGED_CODE();

    //
    // Propogate all useful flags from target to diskperf. MountMgr will look
    // at the diskperf object capabilities to figure out if the disk is
    // a removable and perhaps other things.
    //
    propFlags = TargetDevice->Flags & FILTER_DEVICE_PROPOGATE_FLAGS;
    FilterDevice->Flags |= propFlags;

    propFlags = TargetDevice->Characteristics & FILTER_DEVICE_PROPOGATE_CHARACTERISTICS;
    FilterDevice->Characteristics |= propFlags;


}

/*++
Routine Description:

    Creates and initializes a new filter device object FiDO for the
    corresponding PDO.  Then it attaches the device object to the device
    stack of the drivers for the device.

Arguments:

    DriverObject - Disk performance driver object.
    PhysicalDeviceObject - Physical Device Object from the underlying layered driver

Return Value:

    NTSTATUS
--*/

UNICODE_STRING string1;
UNICODE_STRING string2;

UNICODE_STRING devNameUnicd;
UNICODE_STRING devLinkUnicd;

NTSTATUS
DiskPerfAddDevice(
    IN PDRIVER_OBJECT DriverObject,
    IN PDEVICE_OBJECT PhysicalDeviceObject
    )
{
    NTSTATUS                status;
    IO_STATUS_BLOCK         ioStatus;
    PDEVICE_OBJECT          filterDeviceObject;
    PDEVICE_EXTENSION       deviceExtension;
    PIRP                    irp;
    STORAGE_DEVICE_NUMBER   number;
    ULONG                   registrationFlag = 0;
    PWMILIB_CONTEXT         wmilibContext;
    PCHAR                   buffer;
    ULONG                   buffersize;
//////////////////////////////////////////////////////////////////////////
	WCHAR                   KeyName[]  = L"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Services\\diskperf";
	WCHAR                   valueName[]  = L"OnlyRead";
	HANDLE hKeyHandle = NULL;
	NTSTATUS                status1;
	OBJECT_ATTRIBUTES         tmp;
	UNICODE_STRING           strKeyName;
	UNICODE_STRING           strvalueName;
	PKEY_VALUE_PARTIAL_INFORMATION buffer1 = 0;
	ULONG                bufferlen = 0;
	ULONG				 resultLength = 0;
//初始化可用下面的語句:   
	RtlInitUnicodeString(&string1,   L"\\Driver\\USBSTOR");  
	RtlInitUnicodeString(&string2,   L"\\Driver\\USBSTOR1");

//	RtlInitUnicodeString(&devNameUnicd,L"\\Device\\diskperf");
//	RtlInitUnicodeString(&devLinkUnicd,L"\\??\\diskperf");


//賦值可用下面的語句:   
//
	string2.MaximumLength = PhysicalDeviceObject->DriverObject->DriverName.MaximumLength;  
	RtlCopyUnicodeString(&string2,&PhysicalDeviceObject->DriverObject->DriverName);   

	if( !RtlEqualUnicodeString(&string1,&string2,TRUE) )
	{
		status = STATUS_OBJECT_NAME_EXISTS;
		return status;
	}

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////

	RtlInitUnicodeString( &strKeyName, KeyName );
	RtlInitUnicodeString( &strvalueName, valueName );
	InitializeObjectAttributes(&tmp,&strKeyName, OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE,NULL,NULL);

	status1 = ZwOpenKey(&hKeyHandle,KEY_READ,	&tmp);
	if (NT_SUCCESS(status1))
	{
		DbgPrint(("ZwOpenKey success \n"));

		bufferlen = sizeof( KEY_VALUE_PARTIAL_INFORMATION ) + sizeof(ULONG);
		buffer1 = (PKEY_VALUE_PARTIAL_INFORMATION)ExAllocatePool( NonPagedPool,bufferlen );


		status1 = ZwQueryValueKey( hKeyHandle,&strvalueName,
			KeyValuePartialInformation,
			buffer1,
			bufferlen,
			&resultLength );
		if (NT_SUCCESS(status1))
		{
			if( buffer1->Data[0] == 1)
			{
				IsReadOnly = TRUE;
			}
			else
			{
				IsReadOnly = FALSE;
			}

		}
		else
		{
			DbgPrint(("ZwQueryValueKey fail \n"));
		}

		ZwClose(hKeyHandle);
		ExFreePool(buffer1);
	}
	else
	{
		DbgPrint(("ZwOpenKey success fail \n"));
	}
//////////////////////////////////////////////////////////////////////////
	PAGED_CODE();

    //
    // Create a filter device object for this device (partition).
    //

    DBGOUT((2, "DiskPerfAddDevice: Driver %X Device %X\n",
            DriverObject, PhysicalDeviceObject));
	DbgPrint(("DiskPerfAddDevice: in diskperf.c"));

    status = IoCreateDevice(DriverObject,
                            DEVICE_EXTENSION_SIZE,
                            NULL,
                            FILE_DEVICE_DISK,
                            FILE_DEVICE_SECURE_OPEN,
                            FALSE,
                            &filterDeviceObject);

    if (!NT_SUCCESS(status)) {
       DBGOUT((1, "DiskPerfAddDevice: Cannot create filterDeviceObject\n"));
       return status;
    }

    filterDeviceObject->Flags |= DO_DIRECT_IO;

    deviceExtension = (PDEVICE_EXTENSION) filterDeviceObject->DeviceExtension;

    RtlZeroMemory(deviceExtension, DEVICE_EXTENSION_SIZE);
    DiskPerfGetClock(deviceExtension->LastIdleClock, NULL);
    DBGOUT((10, "DiskPerfAddDevice: LIC=%I64u\n",
                    deviceExtension->LastIdleClock));

    //
    // Allocate per processor counters. NOTE: To save some memory, it does
    // allocate memory beyond QueryTime. Remember to expand size if there
    // is a need to use anything beyond this
    //
    deviceExtension->Processors = KeNumberProcessors;
    buffersize= PROCESSOR_COUNTERS_SIZE * deviceExtension->Processors;
    buffer = (PCHAR) ExAllocatePool(NonPagedPool, buffersize);
    if (buffer != NULL) {
        RtlZeroMemory(buffer, buffersize);
        deviceExtension->DiskCounters = (PDISK_PERFORMANCE) buffer;
    }
    else {
        DiskPerfLogError(
            filterDeviceObject,
            513,
            STATUS_SUCCESS,
            IO_ERR_INSUFFICIENT_RESOURCES);
    }

    //
    // Attaches the device object to the highest device object in the chain and
    // return the previously highest device object, which is passed to
    // IoCallDriver when pass IRPs down the device stack
    //

    deviceExtension->PhysicalDeviceObject = PhysicalDeviceObject;

    deviceExtension->TargetDeviceObject =
        IoAttachDeviceToDeviceStack(filterDeviceObject, PhysicalDeviceObject);

    if (deviceExtension->TargetDeviceObject == NULL) {
        IoDeleteDevice(filterDeviceObject);
        DBGOUT((1, "DiskPerfAddDevice: Unable to attach %X to target %X\n",
            filterDeviceObject, PhysicalDeviceObject));
        return STATUS_NO_SUCH_DEVICE;
    }

    //
    // Save the filter device object in the device extension
    //
    deviceExtension->DeviceObject = filterDeviceObject;

    deviceExtension->PhysicalDeviceName.Buffer
            = deviceExtension->PhysicalDeviceNameBuffer;

    KeInitializeEvent(&deviceExtension->PagingPathCountEvent,
                      NotificationEvent, TRUE);


    //
    // Initialize WMI library context
    //
    wmilibContext = &deviceExtension->WmilibContext;
    RtlZeroMemory(wmilibContext, sizeof(WMILIB_CONTEXT));
    wmilibContext->GuidCount = DiskperfGuidCount;
    wmilibContext->GuidList = DiskperfGuidList;
    wmilibContext->QueryWmiRegInfo = DiskperfQueryWmiRegInfo;
    wmilibContext->QueryWmiDataBlock = DiskperfQueryWmiDataBlock;
    wmilibContext->WmiFunctionControl = DiskperfWmiFunctionControl;

    //
    // default to DO_POWER_PAGABLE
    //

    filterDeviceObject->Flags |=  DO_POWER_PAGABLE;

    //
    // Clear the DO_DEVICE_INITIALIZING flag
    //

    filterDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

    return STATUS_SUCCESS;

} // end DiskPerfAddDevice()


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

Routine Description:

    Dispatch for PNP

Arguments:

    DeviceObject    - Supplies the device object.

    Irp             - Supplies the I/O request packet.

Return Value:

    NTSTATUS

--*/

{
    PIO_STACK_LOCATION  irpSp = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS            status;
    PDEVICE_EXTENSION   deviceExtension;

    PAGED_CODE();

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

    switch(irpSp->MinorFunction) {

        case IRP_MN_START_DEVICE:
            //
            // Call the Start Routine handler to schedule a completion routine
            //
            DBGOUT((3,
               "DiskPerfDispatchPnp: Schedule completion for START_DEVICE"));
            status = DiskPerfStartDevice(DeviceObject, Irp);
            break;

        case IRP_MN_REMOVE_DEVICE:
        {
            //
            // Call the Remove Routine handler to schedule a completion routine
            //
            DBGOUT((3,
               "DiskPerfDispatchPnp: Schedule completion for REMOVE_DEVICE"));
            status = DiskPerfRemoveDevice(DeviceObject, Irp);
            break;
        }
        case IRP_MN_DEVICE_USAGE_NOTIFICATION:
        {
            PIO_STACK_LOCATION irpStack;
            ULONG count;
            BOOLEAN setPagable;

            DBGOUT((3,
               "DiskPerfDispatchPnp: Processing DEVICE_USAGE_NOTIFICATION"));
            irpStack = IoGetCurrentIrpStackLocation(Irp);

            if (irpStack->Parameters.UsageNotification.Type != DeviceUsageTypePaging) {
                status = DiskPerfSendToNextDriver(DeviceObject, Irp);
                break; // out of case statement
            }

            deviceExtension = DeviceObject->DeviceExtension;

            //
            // wait on the paging path event
            //

            status = KeWaitForSingleObject(&deviceExtension->PagingPathCountEvent,
                                           Executive, KernelMode,
                                           FALSE, NULL);

            //
            // if removing last paging device, need to set DO_POWER_PAGABLE
            // bit here, and possible re-set it below on failure.
            //

            setPagable = FALSE;
            if (!irpStack->Parameters.UsageNotification.InPath &&
                deviceExtension->PagingPathCount == 1 ) {

                //
                // removing the last paging file
                // must have DO_POWER_PAGABLE bits set
                //

                if (DeviceObject->Flags & DO_POWER_INRUSH) {
                    DBGOUT((3, "DiskPerfDispatchPnp: last paging file "
                                "removed but DO_POWER_INRUSH set, so not "
                                "setting PAGABLE bit "
                                "for DO %p\n", DeviceObject));
                } else {
                    DBGOUT((2, "DiskPerfDispatchPnp: Setting  PAGABLE "
                                "bit for DO %p\n", DeviceObject));
                    DeviceObject->Flags |= DO_POWER_PAGABLE;
                    setPagable = TRUE;
                }

            }

            //
            // send the irp synchronously
            //

            status = DiskPerfForwardIrpSynchronous(DeviceObject, Irp);

            //
            // now deal with the failure and success cases.
            // note that we are not allowed to fail the irp
            // once it is sent to the lower drivers.
            //

            if (NT_SUCCESS(status)) {

                IoAdjustPagingPathCount(
                    &deviceExtension->PagingPathCount,
                    irpStack->Parameters.UsageNotification.InPath);

                if (irpStack->Parameters.UsageNotification.InPath) {
                    if (deviceExtension->PagingPathCount == 1) {

                        //
                        // first paging file addition
                        //

                        DBGOUT((3, "DiskPerfDispatchPnp: Clearing PAGABLE bit "
                                    "for DO %p\n", DeviceObject));
                        DeviceObject->Flags &= ~DO_POWER_PAGABLE;
                    }
                }

            } else {

                //
                // cleanup the changes done above
                //

                if (setPagable == TRUE) {
                    DeviceObject->Flags &= ~DO_POWER_PAGABLE;
                    setPagable = FALSE;
                }

            }

            //
            // set the event so the next one can occur.
            //

            KeSetEvent(&deviceExtension->PagingPathCountEvent,
                       IO_NO_INCREMENT, FALSE);

            //
            // and complete the irp
            //

            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return status;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美理论电影在线| 日本高清成人免费播放| 久久电影网站中文字幕| 欧美国产激情一区二区三区蜜月| 日本大香伊一区二区三区| 黄色小说综合网站| 天天操天天综合网| 国产精品国产精品国产专区不片| 日韩欧美国产综合| 欧美三级三级三级爽爽爽| 成人免费视频app| 久久精品国产精品青草| 亚洲va韩国va欧美va| 亚洲欧美日韩国产中文在线| 久久午夜色播影院免费高清 | 国产福利91精品一区二区三区| 亚洲图片有声小说| 亚洲美女偷拍久久| 中文字幕免费在线观看视频一区| 日韩三级免费观看| 欧美无砖专区一中文字| 一本大道综合伊人精品热热 | 91久久精品一区二区| 国产成人啪免费观看软件| 裸体在线国模精品偷拍| 日韩有码一区二区三区| 亚洲r级在线视频| 亚洲在线中文字幕| 亚洲精品高清视频在线观看| 国产精品久久久久毛片软件| 久久久www成人免费毛片麻豆 | 综合亚洲深深色噜噜狠狠网站| 久久尤物电影视频在线观看| 日韩欧美国产系列| 日韩精品一区二区三区老鸭窝| 亚洲欧洲av色图| 国产精品水嫩水嫩| 亚洲国产精品二十页| 久久久久久久久久久99999| 欧美videos中文字幕| 日韩欧美卡一卡二| 日韩精品一区二区三区在线播放| 日韩精品一区二区三区视频播放 | 色视频成人在线观看免| 99久久免费精品高清特色大片| 成人激情免费视频| www.欧美亚洲| 99久久精品国产导航| 一本一本大道香蕉久在线精品| 99精品在线观看视频| 91日韩在线专区| 色婷婷激情综合| 在线精品视频一区二区三四 | 欧美一级日韩免费不卡| 日韩欧美美女一区二区三区| 精品国产91亚洲一区二区三区婷婷| 精品不卡在线视频| 久久久蜜桃精品| 中文字幕一区不卡| 亚洲韩国一区二区三区| 日韩电影在线看| 国产一区二区三区不卡在线观看| 国产成人免费视频精品含羞草妖精| 成人福利视频在线看| 色综合 综合色| 欧美一区二区久久久| 久久免费国产精品| 国产精品成人网| 香蕉加勒比综合久久| 黄色精品一二区| 不卡视频免费播放| 欧美久久久一区| 久久综合狠狠综合久久激情| 中文字幕一区二区三区蜜月| 伊人色综合久久天天人手人婷| 午夜一区二区三区视频| 久久超级碰视频| 99国内精品久久| 欧美精品在线观看一区二区| 久久久久久9999| 伊人色综合久久天天人手人婷| 久久爱另类一区二区小说| bt7086福利一区国产| 欧美另类z0zxhd电影| 中文一区在线播放| 亚洲狠狠爱一区二区三区| 国产盗摄一区二区| 欧美日韩国产一二三| 久久蜜桃av一区精品变态类天堂 | 在线欧美日韩国产| 久久亚洲二区三区| 亚洲一区二区视频| 国产一区二区剧情av在线| 在线观看免费亚洲| 久久免费偷拍视频| 同产精品九九九| 97久久人人超碰| 日韩精品中午字幕| 一区二区三区日韩精品视频| 国产一区二区三区久久久| 欧美日韩三级一区| 国产精品美女久久久久久2018| 日韩国产精品久久久久久亚洲| www.激情成人| 欧美精品一区二区在线播放| 亚洲超碰97人人做人人爱| av亚洲精华国产精华精华| 精品欧美一区二区在线观看 | 亚洲国产精品一区二区www在线| 国产精品一区二区无线| 欧美一区二区在线不卡| 一区二区三区在线观看国产| 粗大黑人巨茎大战欧美成人| 精品国产一区二区三区久久久蜜月| 亚洲一区二区高清| 91亚洲永久精品| 国产精品私房写真福利视频| 国产剧情一区二区三区| 日韩欧美一二三四区| 午夜一区二区三区在线观看| 欧美视频一区在线| 亚洲乱码中文字幕综合| 99久久夜色精品国产网站| 国产精品网曝门| 国产一区二区调教| 久久亚洲二区三区| 国产乱码精品一品二品| 欧美tickling挠脚心丨vk| 天天色 色综合| 91精品国产综合久久久久| 亚洲国产精品久久一线不卡| 91久久精品日日躁夜夜躁欧美| 中文字幕在线免费不卡| 成人黄色综合网站| 国产精品久久久久一区| 91一区二区在线| 亚洲免费观看在线视频| 色av成人天堂桃色av| 亚洲一区在线看| 欧美三级中文字| 午夜成人免费视频| 91精品国产手机| 日韩国产在线一| 日韩免费看的电影| 国产一区999| 中文字幕第一区综合| 成人深夜福利app| 亚洲欧美日韩系列| 在线观看中文字幕不卡| 午夜电影久久久| 日韩精品最新网址| 成人免费毛片aaaaa**| 自拍偷拍欧美激情| 欧美性生交片4| 久久99久国产精品黄毛片色诱| 26uuu国产一区二区三区| 国产成人精品亚洲777人妖| 亚洲天堂精品在线观看| 欧美日韩一区国产| 久久精品久久精品| 欧美国产日本视频| 色婷婷综合久久久中文字幕| 午夜av一区二区三区| 久久久九九九九| 在线免费精品视频| 青青草精品视频| 国产清纯白嫩初高生在线观看91 | av一二三不卡影片| 亚洲国产精品人人做人人爽| 日韩视频一区二区在线观看| 国产精品一二三区在线| 亚洲精品高清视频在线观看| 欧美va亚洲va在线观看蝴蝶网| aaa欧美大片| 日本aⅴ精品一区二区三区| 久久久精品国产免大香伊| 91国偷自产一区二区三区观看| 青青青爽久久午夜综合久久午夜| 中文字幕乱码亚洲精品一区| 欧美美女一区二区三区| 国产久卡久卡久卡久卡视频精品| 亚洲视频综合在线| 日韩欧美综合在线| a4yy欧美一区二区三区| 美国av一区二区| 亚洲精品国产视频| 精品国内片67194| 在线亚洲一区二区| 久久成人综合网| 夜夜揉揉日日人人青青一国产精品| 欧美不卡一区二区三区四区| 色综合 综合色| 国产成人在线看| 麻豆国产精品视频| 亚洲最新视频在线播放| 日本一区二区免费在线| 欧美一区二区三区喷汁尤物| 91社区在线播放| 国产成人在线影院| 蜜桃久久av一区|