strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
阅读:2034回复:10

放一段读逻辑扇区的代码,顺便请教读物理扇区的方法

楼主#
更多 发布于:2007-03-21 11:15
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;
}
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-21 14:33
请高手赐教能读物理扇区的办法,分数没关系。
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-21 18:53
引用第2楼zealsoft_zhu2007-03-21 14:20发表的“”:
直接zwcreatefile打开设备,读就是了,这样更麻烦。


我的代码,能读硬盘逻辑扇区,但不能读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" );
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
地板#
发布于:2007-03-21 22:58
就是在做文件过滤驱动啊
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-22 21:55
有办法吗?或能让 4 楼的代码能读U盘的逻辑扇区也行。
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-23 21:41
可以,MountVolume 中的 newDevExt->StorageStackDeviceObject
游客

返回顶部