|
这是我自己写的一段对指定扇区进行写操作的代码,我手里面有几个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, 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";
- //我是的虚拟机只有一个硬盘分区Harddisk0\\DR1
- //所以插进来的第一个U盘的名称就是Harddisk1\\DR1
- WCHAR str[512]=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盘内部的保护。。。奇怪 |
|