阅读:2186回复:10
放一段读逻辑扇区的代码,顺便请教读物理扇区的方法
IFS Document 中 File System Recognizers 的一段代码,读取磁盘逻辑分区的扇区内容。顺便请教如何读取物理扇区的内容,比如硬盘主引导区?
// ReadDiskSector // 从一个特定的卷读取一个扇区 // 输入参数: // pDeviceObject - 磁盘设备对象的指针. // DiskSector - 需要读取的扇区号. // Outputs: // Buffer - 用于接收读取内容的缓冲区. // Returns: // Returns TRUE if the disk sector was read. BOOLEAN ReadDiskSector ( IN PDEVICE_OBJECT pDeviceObject, IN ULONG DiskSector, IN UCHAR* Buffer ) // must be DEVICE_LOGICAL_BLOCKSIZE = 512 bytes long. { LARGE_INTEGER startingOffset; PIRP irp; IO_STATUS_BLOCK ioStatus; KEVENT event; NTSTATUS status; ULONG sectorSize; PUCHAR mbr; PAGED_CODE(); startingOffset.QuadPart = ( LONGLONG ) DiskSector * DEVICE_LOGICAL_BLOCKSIZE; //创建一个用于检查是否完成通知事件对象 KeInitializeEvent( &event, NotificationEvent, FALSE ); // 获得扇区大小 sectorSize = DEVICE_LOGICAL_BLOCKSIZE; // 分配内存. mbr = ExAllocatePool( NonPagedPoolCacheAligned, sectorSize ); if ( !mbr ) { return FALSE; } // 创建读MBR的IRP irp = IoBuildSynchronousFsdRequest( IRP_MJ_READ, pDeviceObject, mbr, sectorSize, &startingOffset, &event, &ioStatus ); if ( irp == NULL ) { ExFreePool( mbr ); return FALSE; } // 把IRP传送给端口驱动程序 status = IoCallDriver( pDeviceObject, irp ); if ( status == STATUS_PENDING ) { KeWaitForSingleObject( &event, //Executive, Suspended, KernelMode, FALSE, NULL); status = ioStatus.Status; } if ( !NT_SUCCESS( status ) ) { ExFreePool( mbr ); return FALSE; } // 返回读取的扇区信息 RtlCopyMemory( Buffer, mbr, sectorSize ); ExFreePool( mbr ); return TRUE; } |
|
沙发#
发布于:2007-03-23 21:41
可以,MountVolume 中的 newDevExt->StorageStackDeviceObject
|
|
板凳#
发布于:2007-03-23 18:46
请问楼主,你的这个读扇区的程序第一个参数能不能在文件过滤层获取啊
|
|
|
地板#
发布于:2007-03-22 21:55
有办法吗?或能让 4 楼的代码能读U盘的逻辑扇区也行。
|
|
地下室#
发布于:2007-03-22 08:34
用scsi命令去读,不管physical/logical都可以读到,但不管哪种,都必须是storage device object。
|
|
|
5楼#
发布于:2007-03-21 22:58
就是在做文件过滤驱动啊
|
|
6楼#
发布于:2007-03-21 21:34
兄弟,你这个代码能够防止文件过滤驱动的拦截吗?偶最近也需要读写磁盘扇区
|
|
|
7楼#
发布于:2007-03-21 18:53
引用第2楼zealsoft_zhu于2007-03-21 14:20发表的“”: 我的代码,能读硬盘逻辑扇区,但不能读U盘和物理扇区,且程序死在 ZwCreateFile 那儿了。 另, 若 RtlInitUnicodeString(&uniName, L"\\Device\\HarddiskVolume1\\Windows\\netfxocm.log"); 能读出硬盘文件内容。 但 RtlInitUnicodeString(&uniName, L"\\DosDevices\\C:\\"); 能读出硬盘逻辑扇区。 而 RtlInitUnicodeString(&uniName, L"\\Device\\Harddisk1\\DP(1)0-0+4"); 则死在ZwCreateFile 那儿了。 NTSTATUS status; HANDLE hHandle; OBJECT_ATTRIBUTES InitializedAttributes; IO_STATUS_BLOCK iostatus; LARGE_INTEGER byteOffset; UNICODE_STRING uniName; RtlInitUnicodeString(&uniName, L"\\Device\\Harddisk1\\DP(1)0-0+4"); InitializeObjectAttributes( &InitializedAttributes, &uniName, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL ); DbgPrint( "ReadSectors: InitializeObjectAttributes\n" ); status = ZwCreateFile( &hHandle, FILE_READ_DATA | SYNCHRONIZE, &InitializedAttributes, &iostatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_OPEN, FILE_NON_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0 ); DbgPrint( "ReadSectors: ZwCreateFile\n" ); |
|
8楼#
发布于:2007-03-21 14:33
请高手赐教能读物理扇区的办法,分数没关系。
|
|
9楼#
发布于:2007-03-21 14:20
直接zwcreatefile打开设备,读就是了,这样更麻烦。
|
|
10楼#
发布于:2007-03-21 11:55
自己思考下~~
该DeviceObject必须是分区级的据说~ |
|
|