读写扇区遇到的一些奇怪问题
这是我自己写的一段对指定扇区进行写操作的代码,我手里面有几个U盘拿来都进行了测试,奇怪的是有些U盘能写入,而有些U盘不能写,我在地摊上买的一个便宜货U盘能够随便什么扇区都写。而惠普v250w写随便指定的扇区就在ZwWriteFile返回0xC0000022 STATUS_ACCESS_DENIED,但是能写惠普v250w的0扇区,而且把0扇区写乱之后,拔了重新插MBR乱了提示要格式化,这个时候又来用这个代码写扇区,却又能写惠普v250w随便什么扇区。请问这是U盘芯片里面有什么保护机制,不让奇怪的数据随便写到扇区,还是操作系统不让随便,不过貌似不像这个原因,还是其他什么原因,百思不得其解。
希望有人能解答一下,或者提供点关于写U盘扇区的建议,谢谢。。
#include <fltKernel.h>
#include "ntdddisk.h"
NTSTATUS
WriteSector(IN PUNICODE_STRING PhysicalName, INCHAR 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="111222";
//我是的虚拟机只有一个硬盘分区Harddisk0\\DR1
//所以插进来的第一个U盘的名称就是Harddisk1\\DR1
WCHAR str=L"\\Device\\Harddisk1\\DR1";
UNICODE_STRING PhysicalName;
RtlInitUnicodeString(&PhysicalName,str);
status = ReadOrWriteSector(&PhysicalName, Sectorbuff,100);
if (!NT_SUCCESS(status))
return status;
driver->DriverUnload = DriverUnload;
return STATUS_SUCCESS;
}
追加:我查看了注册表,两个U盘都插入的时候,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet并没有WriteProtect这一项,而且HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR下面的关于两个U盘的项除了名字不一样其他设置都一样,所以应该不是注册表问题。
而且两个U盘是可以正常在资源管理器里面写文件,没有提示写保护之类的,只是用上面那段代码是会有区别,一个能写一个不能。
而且惠普v250w虽然不能写其他扇区,但是能写0扇区,写乱0扇区后,可以写其他扇区,感觉又像是文件系统的对数据保护,又像是U盘内部的保护。。。奇怪 没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。 Tesla.Angela 发表于 2015-3-26 10:19
没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。
设备名可以先等U盘插入了看了再在代码改,这只是个测试的代码
关键是这段代码对有些U盘能写成功,有些则不能 今日徘徊溜达
页:
[1]