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

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

?? sector.c

?? 一個基于Windows系統( NT5.0
?? C
字號:
/*++
Module Name:

    sector.c

Abstract:

    This driver performs RAW reads/writes to the sectors (RAW disk or partitions)

Environment:

    kernel mode only

Notes:

--*/


#define INITGUID

#include "ntddk.h"
#include "ntdddisk.h"
#include "stdarg.h"
#include "stdio.h"
#include <ntddvol.h>

#include <mountdev.h>
#include "wmistr.h"
#include "wmidata.h"
#include "wmiguid.h"
#include "wmilib.h"
#include "sector.h"



WCHAR				g_szDeviceName[] = L"\\Device\\sectorio";
WCHAR				g_szDosDeviceName[] = L"\\DosDevices\\sectorio";
UNICODE_STRING		szDeviceName;
UNICODE_STRING		szDosDeviceName;

PDEVICE_OBJECT	gp_DevObj = NULL;

#pragma alloc_text(INIT, DriverEntry)

NTSTATUS GetGeometry(PDEVICE_OBJECT pDiskDevObj, PDISK_GEOMETRY pDiskGeo)
/*++

Routine Description:

   Returns the Geometry of Disk

Arguments:

   Target Device Object representing the disk and Pointer to geometry structure

Return Value:

    STATUS

--*/
{
	IO_STATUS_BLOCK		IoStatusBlock;
	KEVENT				Event;
	PIRP				pIrp;
	NTSTATUS			status;

	KeInitializeEvent(&Event, NotificationEvent, FALSE);

	pIrp = IoBuildDeviceIoControlRequest(IOCTL_DISK_GET_DRIVE_GEOMETRY,
								  pDiskDevObj, NULL, 0, pDiskGeo,
								  sizeof(DISK_GEOMETRY), FALSE, &Event,
								  &IoStatusBlock);
	
	if (!pIrp) 
	{
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	status = IoCallDriver(pDiskDevObj, pIrp);

	if (status == STATUS_PENDING) 
	{
			KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE,	NULL);
			status = IoStatusBlock.Status;
	}

	return status;
}


NTSTATUS
GetAllDiskObjects()
/*++

Routine Description:

   Enumeration all disk devices

Arguments:

   None

Return Value:

    None

--*/
{
    NTSTATUS		Status;
    PDRIVER_OBJECT	pDiskObject;
    PDEVICE_OBJECT	pDeviceObjectTemp;
    UNICODE_STRING	DestinationString;
    DWORD			dwDeviceNumber;
    DWORD			dwRetLength;
    POBJECT_NAME_INFORMATION pNameBuffer;
    WCHAR			*pNameTemp;
	PDISK_OBJ		pDisk;
	PDISK_GEOMETRY	pDiskGeometry;
	BOOLEAN			bIsFound = FALSE;
	PDEVICE_EXTENSION	pDevExtn = (PDEVICE_EXTENSION)gp_DevObj->DeviceExtension;

    /* All Disk Objects are created by disk.sys driver*/
	RtlInitUnicodeString(&DestinationString, L"\\Driver\\Disk");
    
	// Not a documented function in DDK, see import definition in sector.h
	if (ObReferenceObjectByName(&DestinationString, 64, 0, 0,
								*IoDriverObjectType, KernelMode, 0,
								&pDiskObject) >= 0) 
	{
        pDeviceObjectTemp = pDiskObject->DeviceObject;
        dwDeviceNumber = 0;
        
		if (pDeviceObjectTemp)
        {
			pDiskGeometry = ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY));
            
			if (!pDiskGeometry) 
			{
                       return STATUS_INSUFFICIENT_RESOURCES;
            }

            do
            {
				//Each time memset the geometry structure to zero
				memset(pDiskGeometry, 0x00, sizeof(DISK_GEOMETRY));

                // DeviceType 7 corresponds to FILE_DISK_DEVICE Type Device Object and
				// It should have name too that's why Flags is check for 0x40 (DO_DEVICE_HAS_NAME )
				if (pDeviceObjectTemp->DeviceType == 7
                        && (pDeviceObjectTemp->Flags & 0x40))
                {
                   ObQueryNameString(pDeviceObjectTemp, NULL, 0, &dwRetLength);

                   pNameBuffer = (POBJECT_NAME_INFORMATION)
									ExAllocatePoolWithTag(PagedPool, dwRetLength, ' sFI');
                   
				   if (!pNameBuffer)
                   {
					   ExFreePool(pDiskGeometry);
                       return STATUS_INSUFFICIENT_RESOURCES;
                   }
                   
				   if (ObQueryNameString(pDeviceObjectTemp, pNameBuffer,
										 dwRetLength, &dwRetLength) == STATUS_SUCCESS 
										 && pNameBuffer->Name.Buffer)
                   {
						pDisk  = ExAllocatePool(PagedPool, sizeof(DISK_OBJ));
						
						if (!pDisk) 
						{
									ExFreePool(pDiskGeometry);
									ExFreePool(pNameBuffer);
									return STATUS_INSUFFICIENT_RESOURCES;
						}
                       
						for (pNameTemp = pNameBuffer->Name.Buffer +
							 wcslen(pNameBuffer->Name.Buffer); 
							 pNameTemp > pNameBuffer->Name.Buffer; pNameTemp--) 
						{
								 
									if (!_wcsnicmp(pNameTemp, L"\\DR", 3)) 
									{
										pDisk->bIsRawDiskObj = TRUE;
										bIsFound = TRUE;
										break;
									}
									else if (!_wcsnicmp(pNameTemp, L"\\DP(", 4)) 
									{
										pDisk->bIsRawDiskObj = FALSE;
										bIsFound = TRUE;
										break;
									}
						}
						if (bIsFound) 
						{
							pDisk->dwDiskOrdinal = (USHORT)pNameBuffer->
													Name.Buffer[wcslen(pNameBuffer->Name.Buffer)-1] 
													- (USHORT) L'0';
							pDisk->pDiskDevObj	= pDeviceObjectTemp;

							ExInterlockedInsertTailList(&pDevExtn->list_head, &pDisk->list, &pDevExtn->list_lock);
							
							Status = GetGeometry(pDisk->pDiskDevObj, pDiskGeometry);

							if (!NT_SUCCESS(Status)) 
							{
								pDisk->bGeometryFound = FALSE;
							} 
							else 
							{
								pDisk->bGeometryFound = TRUE;
								pDisk->ulSectorSize = pDiskGeometry->BytesPerSector;
							}
			
						} //end of if (bIsFound) 
                   }//end of if (ObQueryNameString ...)
                   ExFreePoolWithTag(pNameBuffer, 0);

                }//end of if (pDeviceObjectTemp->DeviceType == 7 ...)
                pDeviceObjectTemp = pDeviceObjectTemp->NextDevice;
            } while (pDeviceObjectTemp); // end of while
			ExFreePool(pDiskGeometry); //Free pDiskGeometry
        }
    }
	return STATUS_SUCCESS;
}

NTSTATUS DriverIoDeviceDispatchRoutine(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
{
    PIO_STACK_LOCATION pIsl;
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    ULONG BuffSize, MajorFunc, IoCtl;
	ULONG InputBuffLen, OutputBuffLen;
	PVOID pBuff, pData;
	KIRQL OldIrql;
	LARGE_INTEGER lDiskOffset;
	PIRP  pIrp;
	KEVENT Event;
	IO_STATUS_BLOCK		ioStatus;
	PDISK_OBJ pDiskObj;
	PDISK_LOCATION pDiskLoc;
	PDEVICE_EXTENSION pDevExtn = (PDEVICE_EXTENSION)DeviceObject->DeviceExtension;
	PLIST_ENTRY pList = &pDevExtn->list_head;
   	pList = pList->Flink;

	DbgPrint("Inside DriverIoDeviceDispatchRoutine\n");
	
	pDiskLoc = (PDISK_LOCATION)Irp->AssociatedIrp.SystemBuffer;

	while (pList != &pDevExtn->list_head)
	{
		pDiskObj = (PDISK_OBJ) pList;
		if (pDiskObj->bGeometryFound)
		{
			if (pDiskObj->bIsRawDiskObj == pDiskLoc->bIsRawDiskObj)
			{
				if (pDiskObj->dwDiskOrdinal == pDiskLoc->dwDiskOrdinal)
				{
					break;
				}
			}
		}
		pList = pList->Flink;
	}
		
	if (pList == &pDevExtn->list_head)
	{
			status = STATUS_DEVICE_NOT_CONNECTED;
			goto end;
	}

    pIsl = IoGetCurrentIrpStackLocation (Irp);

	BuffSize = pIsl->Parameters.DeviceIoControl.OutputBufferLength; //For obtaining the sector size
	OutputBuffLen = (pDiskObj->ulSectorSize); // By default output size is sector size
	InputBuffLen = sizeof(DISK_LOCATION); 
	pBuff = Irp->AssociatedIrp.SystemBuffer;


	Irp->IoStatus.Information = 0;

	IoCtl = pIsl->Parameters.DeviceIoControl.IoControlCode; 
	switch(IoCtl)
	{
	case	IOCTL_GET_SECTOR_SIZE:
		
		if (BuffSize >= sizeof(ULONG))
		{
			*(PULONG) pBuff = pDiskObj->ulSectorSize;
			Irp->IoStatus.Information = sizeof(ULONG);
			status = STATUS_SUCCESS;
		} 
		else 
			status = STATUS_INFO_LENGTH_MISMATCH;

		break;

	case	IOCTL_SECTOR_WRITE:
		(ULONG) pBuff = ((ULONG) pBuff) + sizeof(DISK_LOCATION); // To accomodate the very ugly hack of transferring write
															   // information and input buffer into the same buffer
		InputBuffLen = InputBuffLen + (pDiskObj->ulSectorSize); // Inputbufflen shud be DISK_LOCATION + sectorsize as we
																// are recieving data in the same buffer
		OutputBuffLen = 0; //Outputbufflen for write operations shud be zero
		DbgPrint("Inside DriverIoDeviceDispatchRoutine, called for write operation\n");

	case	IOCTL_SECTOR_READ:
		
		if (InputBuffLen > pIsl->Parameters.DeviceIoControl.InputBufferLength)
		{
			status = STATUS_INFO_LENGTH_MISMATCH;
			goto end;
		}
		if (OutputBuffLen > pIsl->Parameters.DeviceIoControl.OutputBufferLength)
		{
			status = STATUS_INFO_LENGTH_MISMATCH;
			goto end;
		}

		MajorFunc  = (IoCtl==IOCTL_SECTOR_READ) ? IRP_MJ_READ : IRP_MJ_WRITE;
		
		lDiskOffset.QuadPart = (pDiskObj->ulSectorSize) * (pDiskLoc->ullSectorNum);
		KeInitializeEvent(&Event, NotificationEvent, FALSE);
		pIrp = IoBuildSynchronousFsdRequest(MajorFunc, pDiskObj->pDiskDevObj, pBuff, 
											pDiskObj->ulSectorSize, &lDiskOffset, 
											&Event, &ioStatus);
		
		if (!pIrp) {
			status = STATUS_INSUFFICIENT_RESOURCES;
			goto end;
		}
		
		status = IoCallDriver(pDiskObj->pDiskDevObj, pIrp);

		if (status == STATUS_PENDING) 
		{
			KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE,	NULL);
			status = ioStatus.Status;

			if (NT_SUCCESS(status))
			{
				Irp->IoStatus.Information = pDiskObj->ulSectorSize;
			}
		}
		break;
	}   

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

NTSTATUS DriverDefaultIrpHandler(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
{
    Irp->IoStatus.Information = 0;
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}

NTSTATUS
DriverEntry(
    IN PDRIVER_OBJECT	pDriverObject,
    IN PUNICODE_STRING	pRegistryPath
    )
{

    ULONG               ulIndex;
	unsigned long		i;
    //PDRIVER_DISPATCH  * dispatch;
	//UNICODE_STRING		diskdevice;
	//PFILE_OBJECT		pFileObj = NULL;
	//PDEVICE_OBJECT		pDevObj  = NULL;
	NTSTATUS			status;
	PDEVICE_EXTENSION	pDevExtn = NULL;
	//CHAR				*sBuf;
	//LARGE_INTEGER		lDiskOffset;
	//KEVENT				Event;
	//IO_STATUS_BLOCK		ioStatus;
	//PIRP				pIrp = NULL;
	//SIZE_T				size = 512;
	DbgPrint("IN DriverEntry\r\n");
    //RtlInitUnicodeString(&diskdevice, L"\\Device\\Harddisk0\\DR0");
	RtlInitUnicodeString(&szDeviceName, g_szDeviceName);
	RtlInitUnicodeString(&szDosDeviceName, g_szDosDeviceName);
	//status = IoGetDeviceObjectPointer(&diskdevice, FILE_ALL_ACCESS, &pFileObj, &pDevObj);
	
	status = IoCreateDevice(pDriverObject, sizeof(DEVICE_EXTENSION), &szDeviceName, FILE_DEVICE_UNKNOWN, 0, /*TRUE*/FALSE, &gp_DevObj);
	
	if (!NT_SUCCESS(status)) 
		return status;

	status = IoCreateSymbolicLink(&szDosDeviceName, &szDeviceName);

	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice(gp_DevObj);
		return status;
	}
	
	pDevExtn = (PDEVICE_EXTENSION)gp_DevObj->DeviceExtension;

	InitializeListHead(&pDevExtn->list_head);
    KeInitializeSpinLock(&pDevExtn->list_lock);

	status = GetAllDiskObjects();

	if (!NT_SUCCESS(status)) 
	{
		IoDeleteDevice(gp_DevObj);
		IoDeleteSymbolicLink(&szDosDeviceName);
		return status;
	}

	for (i= 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i++)
    {
        pDriverObject->MajorFunction[i] = DriverDefaultIrpHandler;
    }
	
	pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DriverIoDeviceDispatchRoutine;
	
	pDriverObject->DriverUnload = DriverUnload;

	/*if (!NT_SUCCESS(status)) {
		DbgPrint("IoGetDeviceObjectPointer Failed\n");
	} else {
		DbgPrint("IoGetDeviceObjectPointer Succceded");
		lDiskOffset.QuadPart = (1169944+63)*512;
		sBuf = ExAllocatePool(NonPagedPool, size);
		
		if (!sBuf) {
			ObDereferenceObject(pFileObj);
			return STATUS_INSUFFICIENT_RESOURCES;
		}
		KeInitializeEvent(&Event, NotificationEvent, FALSE);
		memset(sBuf, 'C', size);
		pIrp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE, pDevObj, sBuf, size, &lDiskOffset, &Event, &ioStatus);
		
		
		if (!pIrp) {
			ObDereferenceObject(pFileObj);
			ExFreePool(sBuf);
			return STATUS_INSUFFICIENT_RESOURCES;
		}
		
		status = IoCallDriver(pDevObj, pIrp);

		if (status == STATUS_PENDING) {
			KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE,	NULL);
			status = ioStatus.Status;
		}
		ExFreePool(sBuf);
		ObDereferenceObject(pFileObj);
	}*/
	
    return(status);

} // end DriverEntry()

VOID
DriverUnload(
    IN PDRIVER_OBJECT pDriverObject
    )
{
	PDEVICE_EXTENSION pDevExtn = (PDEVICE_EXTENSION)gp_DevObj->DeviceExtension;
	PLIST_ENTRY pList = &pDevExtn->list_head;
	PVOID		pObj;

	pList = pList->Flink;

	while(pList != &pDevExtn->list_head) 
	{
		pObj = (PVOID) pList;
		pList = pList->Flink;
		ExFreePool(pObj);
	}

	IoDeleteSymbolicLink(&szDosDeviceName);
    IoDeleteDevice(gp_DevObj);
	
	return ;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲人被黑人高潮完整版| 国产日韩av一区二区| 成人午夜又粗又硬又大| 青青草原综合久久大伊人精品| 亚洲人成在线播放网站岛国| 中文字幕不卡在线观看| 国产欧美一区二区精品婷婷| 欧美精品一区二区在线观看| 欧美一区二区播放| 日韩一区国产二区欧美三区| 欧美一区二区三区四区五区| 3d成人h动漫网站入口| 欧美美女一区二区三区| 欧美吻胸吃奶大尺度电影| 一本色道久久综合狠狠躁的推荐| 99视频有精品| 色天天综合久久久久综合片| 91国产成人在线| 欧美日韩专区在线| 日韩一区二区三区四区| 亚洲精品一区二区三区蜜桃下载 | 国产精品免费网站在线观看| 中文字幕成人在线观看| 综合激情网...| 亚洲国产乱码最新视频 | 美女视频黄免费的久久 | 中文乱码免费一区二区| 日韩一区日韩二区| 亚洲国产aⅴ天堂久久| 喷水一区二区三区| 成人在线一区二区三区| 91久久人澡人人添人人爽欧美| 欧美另类高清zo欧美| 精品美女在线观看| 亚洲人成在线播放网站岛国| 亚洲高清免费视频| 国产精品中文欧美| 欧美日韩中文字幕精品| www日韩大片| 一区二区三区高清在线| 久久99国产精品久久99| 91日韩在线专区| 日韩精品在线一区| 亚洲老司机在线| 韩国精品主播一区二区在线观看| 99re免费视频精品全部| 欧美一级二级在线观看| 亚洲视频香蕉人妖| 精品中文字幕一区二区小辣椒| 91污片在线观看| 精品人在线二区三区| 日韩伦理免费电影| 寂寞少妇一区二区三区| 在线观看视频一区| 国产精品伦理一区二区| 久久成人综合网| 欧美日韩一级黄| 亚洲三级免费观看| 国产91丝袜在线播放九色| 欧美色图天堂网| 亚洲图片欧美激情| 国产不卡在线视频| 欧美大胆一级视频| 五月天久久比比资源色| 色狠狠av一区二区三区| 国产精品免费久久| 国产成人亚洲综合a∨婷婷图片 | 国产无遮挡一区二区三区毛片日本| 亚洲成人一区在线| 在线观看日韩一区| 亚洲免费毛片网站| 91亚洲国产成人精品一区二三| 国产欧美久久久精品影院| 寂寞少妇一区二区三区| 日韩三级中文字幕| 欧美aaaaaa午夜精品| 欧美久久久一区| 婷婷综合五月天| 欧美日韩国产成人在线免费| 一区二区三区欧美| 欧美性猛交xxxx乱大交退制版 | 日本道免费精品一区二区三区| 久久久午夜电影| 国产激情视频一区二区在线观看| 日韩欧美你懂的| 成人小视频在线观看| 国产亚洲福利社区一区| 成人性视频网站| 中文字幕佐山爱一区二区免费| 成人福利视频在线看| 亚洲欧洲成人自拍| 91国偷自产一区二区三区成为亚洲经典| 最新国产の精品合集bt伙计| 91老司机福利 在线| 亚洲一区自拍偷拍| 91精品中文字幕一区二区三区| 天天综合色天天综合| 日韩欧美三级在线| 高清视频一区二区| 最新日韩在线视频| 欧美日韩国产免费| 激情六月婷婷综合| 成人免费在线视频观看| 欧洲色大大久久| 美女网站色91| 国产精品伦理在线| 欧美日本在线播放| 国产福利91精品一区| 亚洲日本免费电影| 欧美一级二级在线观看| 成人综合在线观看| 亚洲高清免费一级二级三级| 欧美xxxxxxxx| 91香蕉视频污在线| 久久国产视频网| 亚洲欧洲成人自拍| 日韩一二三区不卡| av不卡一区二区三区| 青青草原综合久久大伊人精品 | 91亚洲男人天堂| 日日夜夜精品视频免费| 国产欧美日韩在线| 欧美剧情电影在线观看完整版免费励志电影| 激情综合网最新| 亚洲午夜电影在线| 国产欧美一区二区精品性色| 欧美精品久久99久久在免费线 | 日韩理论片网站| 精品久久久久香蕉网| 一本色道久久综合精品竹菊| 精品夜夜嗨av一区二区三区| 亚洲色图视频免费播放| 久久精品人人爽人人爽| 欧美日韩在线精品一区二区三区激情 | 久久一区二区三区国产精品| 在线观看日韩国产| 99久久99久久免费精品蜜臀| 国产一区二区三区高清播放| 三级久久三级久久| 有坂深雪av一区二区精品| 欧美韩日一区二区三区| 精品日本一线二线三线不卡| 在线不卡的av| 欧美三级日韩三级| 欧美视频精品在线观看| 一本久久a久久免费精品不卡| 国产真实乱子伦精品视频| 爽爽淫人综合网网站| 亚洲高清久久久| 亚洲综合男人的天堂| 亚洲欧美成aⅴ人在线观看| 国产精品天天摸av网| 国产日韩欧美精品综合| 久久精品人人做人人爽人人| 亚洲精品在线免费播放| 精品88久久久久88久久久| 精品国精品国产| 欧美tk丨vk视频| 精品99久久久久久| 久久亚洲一区二区三区明星换脸| 日韩欧美国产三级| 欧美精品一区二区三区在线 | av电影一区二区| 暴力调教一区二区三区| 成人听书哪个软件好| 国产成人综合视频| 不卡视频免费播放| 色偷偷88欧美精品久久久| 一本大道久久a久久综合婷婷| 91啦中文在线观看| 欧美色图免费看| 6080日韩午夜伦伦午夜伦| 日韩欧美国产系列| 国产夜色精品一区二区av| 国产精品麻豆久久久| 亚洲综合一区二区| 性感美女极品91精品| 精品一区二区三区视频在线观看| 激情综合亚洲精品| 成人免费高清在线观看| 91免费小视频| 欧美精品三级日韩久久| 精品成人在线观看| 国产精品福利一区| 日韩一区欧美二区| 成人免费视频caoporn| 在线免费观看不卡av| 日韩美女天天操| 国产精品日日摸夜夜摸av| 一区二区三区av电影 | 国产不卡高清在线观看视频| 91视视频在线观看入口直接观看www| 色狠狠av一区二区三区| 91精品国产综合久久福利| 欧美激情一区二区| 午夜精品福利一区二区三区蜜桃| 久久成人18免费观看| 色偷偷88欧美精品久久久| 精品sm捆绑视频| 亚洲综合色在线|