liwen930723 发表于 2015-3-26 10:02:15

读写扇区遇到的一些奇怪问题

这是我自己写的一段对指定扇区进行写操作的代码,我手里面有几个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盘内部的保护。。。奇怪

Tesla.Angela 发表于 2015-3-26 10:19:04

没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。

liwen930723 发表于 2015-3-26 10:28:53

Tesla.Angela 发表于 2015-3-26 10:19
没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。

设备名可以先等U盘插入了看了再在代码改,这只是个测试的代码
关键是这段代码对有些U盘能写成功,有些则不能

upring 发表于 2015-4-29 09:30:30

今日徘徊溜达
页: [1]
查看完整版本: 读写扇区遇到的一些奇怪问题