首页
社区
课程
招聘
[求助]读写扇区遇到的一些奇怪问题
发表于: 2015-3-25 22:43 3463

[求助]读写扇区遇到的一些奇怪问题

2015-3-25 22:43
3463
问题已经解决,是设备名的问题,应该打开的是卷设备而不是物理设备

#include <fltKernel.h>
#include "ntdddisk.h"

NTSTATUS
WriteSector(IN PUNICODE_STRING PhysicalName, IN  CHAR Sectorbuff[],IN INT StartSector)//指定扇区写
{
	NTSTATUS status;
	OBJECT_ATTRIBUTES ObjectAttributesL;
	HANDLE hDeviceHandle;
	IO_STATUS_BLOCK IoStatusBlock;
	IO_STATUS_BLOCK IoStatusBlockR;
	LARGE_INTEGER ByteOffset;

	InitializeObjectAttributes(&ObjectAttributesL,
		PhysicalName,
		OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
		NULL,
		NULL);

	//打开设备
	status = ZwCreateFile(&hDeviceHandle,
		FILE_ALL_ACCESS,
		&ObjectAttributesL,
		&IoStatusBlock,
		NULL,
		0,
		FILE_SHARE_WRITE,
		FILE_OPEN,
		FILE_SYNCHRONOUS_IO_ALERT,
		NULL,
		0);
	DbgPrint("ZwCreateFile status:%x\n", status);
	
	if (!NT_SUCCESS(status))
	{
		ZwDeleteFile(&ObjectAttributesL);	
		return status;
	}
	
	//在指定扇区写入数据
	ByteOffset.QuadPart = StartSector * 512;
	status = ZwWriteFile(hDeviceHandle,
		NULL,
		NULL,
		NULL,
		&IoStatusBlockR,
		Sectorbuff,
		512,
		&ByteOffset,
		NULL);
	DbgPrint("ZwWriteFile status:%x\n", status);
	
	
	if (hDeviceHandle)
	{
		ZwClose(hDeviceHandle);
		ZwDeleteFile(&ObjectAttributesL);
	}

	return status;
}

VOID
DriverUnload(PDRIVER_OBJECT driver)
{
	DbgPrint("first: Our driver is unloading…\r\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
{
	
	NTSTATUS status;
	CHAR Sectorbuff[512]="111222";
	//Harddisk1\\Partition0是Harddisk1\\harddiskvolume%d符号链接
	//可以用Winobj看
        WCHAR str[512]=L"\\Device\\Harddisk1\\Partition1";
	UNICODE_STRING PhysicalName;

	RtlInitUnicodeString(&PhysicalName,str);
	
	status = ReadOrWriteSector(&PhysicalName, Sectorbuff,100);
	if (!NT_SUCCESS(status))
		return status;
	
	driver->DriverUnload = DriverUnload;
	
	return STATUS_SUCCESS;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 8
活跃值: (120)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是不是系统注册表的那个,U盘防止写入的问题呀?
2015-3-26 09:19
0
雪    币: 53
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ZwWriteFile写的应该是物理设备
举例如下:
物理设备是这样的:\Device\Harddisk0\DR0
卷设备是这样的:\Device\harddiskvolume2

\Device\Harddisk0\Parition0是物理设备的符号链接
而\Device\Harddisk0\Parition1是卷设备的符号链接

卷设备和物理设备之间的联系。
可以通过winobj看具体的例子,以上个人理解。
2015-3-26 09:46
0
游客
登录 | 注册 方可回帖
返回
//