找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4314|回复: 3

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

[复制链接]

1

主题

17

回帖

0

精华

铜牌会员

积分
80
发表于 2015-3-26 10:02:15 | 显示全部楼层 |阅读模式
这是我自己写的一段对指定扇区进行写操作的代码,我手里面有几个U盘拿来都进行了测试,奇怪的是有些U盘能写入,而有些U盘不能写,我在地摊上买的一个便宜货U盘能够随便什么扇区都写。而惠普v250w写随便指定的扇区就在ZwWriteFile返回0xC0000022 STATUS_ACCESS_DENIED,但是能写惠普v250w的0扇区,而且把0扇区写乱之后,拔了重新插MBR乱了提示要格式化,这个时候又来用这个代码写扇区,却又能写惠普v250w随便什么扇区。

请问这是U盘芯片里面有什么保护机制,不让奇怪的数据随便写到扇区,还是操作系统不让随便,不过貌似不像这个原因,还是其他什么原因,百思不得其解。

希望有人能解答一下,或者提供点关于写U盘扇区的建议,谢谢。。

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

  3. NTSTATUS
  4. WriteSector(IN PUNICODE_STRING PhysicalName, IN  CHAR Sectorbuff[],IN INT StartSector)//指定扇区写
  5. {
  6.   NTSTATUS status;
  7.   OBJECT_ATTRIBUTES ObjectAttributesL;
  8.   HANDLE hDeviceHandle;
  9.   IO_STATUS_BLOCK IoStatusBlock;
  10.   IO_STATUS_BLOCK IoStatusBlockR;
  11.   LARGE_INTEGER ByteOffset;

  12.   InitializeObjectAttributes(&ObjectAttributesL,
  13.     PhysicalName,
  14.     OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
  15.     NULL,
  16.     NULL);

  17.   //打开设备
  18.   status = ZwCreateFile(&hDeviceHandle,
  19.     FILE_ALL_ACCESS,
  20.     &ObjectAttributesL,
  21.     &IoStatusBlock,
  22.     NULL,
  23.     0,
  24.     FILE_SHARE_WRITE,
  25.     FILE_OPEN,
  26.     FILE_SYNCHRONOUS_IO_ALERT,
  27.     NULL,
  28.     0);
  29.   DbgPrint("ZwCreateFile status:%x\n", status);
  30.   
  31.   if (!NT_SUCCESS(status))
  32.   {
  33.     ZwDeleteFile(&ObjectAttributesL);  
  34.     return status;
  35.   }
  36.   
  37.   //在指定扇区写入数据
  38.   ByteOffset.QuadPart = StartSector * 512;
  39.   status = ZwWriteFile(hDeviceHandle,
  40.     NULL,
  41.     NULL,
  42.     NULL,
  43.     &IoStatusBlockR,
  44.     Sectorbuff,
  45.     512,
  46.     &ByteOffset,
  47.     NULL);
  48.   DbgPrint("ZwWriteFile status:%x\n", status);
  49.   
  50.   
  51.   if (hDeviceHandle)
  52.   {
  53.     ZwClose(hDeviceHandle);
  54.     ZwDeleteFile(&ObjectAttributesL);
  55.   }

  56.   return status;
  57. }

  58. VOID
  59. DriverUnload(PDRIVER_OBJECT driver)
  60. {
  61.   DbgPrint("first: Our driver is unloading…\r\n");
  62. }

  63. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path)
  64. {
  65.   
  66.   NTSTATUS status;
  67.   CHAR Sectorbuff[512]="111222";
  68.   //我是的虚拟机只有一个硬盘分区Harddisk0\\DR1
  69.   //所以插进来的第一个U盘的名称就是Harddisk1\\DR1
  70.   WCHAR str[512]=L"\\Device\\Harddisk1\\DR1";
  71.   UNICODE_STRING PhysicalName;

  72.   RtlInitUnicodeString(&PhysicalName,str);
  73.   
  74.   status = ReadOrWriteSector(&PhysicalName, Sectorbuff,100);
  75.   if (!NT_SUCCESS(status))
  76.     return status;
  77.   
  78.   driver->DriverUnload = DriverUnload;
  79.   
  80.   return STATUS_SUCCESS;
  81. }
复制代码



追加:我查看了注册表,两个U盘都插入的时候,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet并没有WriteProtect这一项,而且HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\USBSTOR下面的关于两个U盘的项除了名字不一样其他设置都一样,所以应该不是注册表问题。
而且两个U盘是可以正常在资源管理器里面写文件,没有提示写保护之类的,只是用上面那段代码是会有区别,一个能写一个不能。
而且惠普v250w虽然不能写其他扇区,但是能写0扇区,写乱0扇区后,可以写其他扇区,感觉又像是文件系统的对数据保护,又像是U盘内部的保护。。。奇怪

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-3-26 10:19:04 | 显示全部楼层
没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。

1

主题

17

回帖

0

精华

铜牌会员

积分
80
 楼主| 发表于 2015-3-26 10:28:53 | 显示全部楼层
Tesla.Angela 发表于 2015-3-26 10:19
没看懂你想说啥,但至少难以保证每次的设备名都是\\Device\\Harddisk1\\DR1。

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

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-29 09:30:30 | 显示全部楼层
今日徘徊溜达
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表