strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
阅读:2030回复: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;
}
killvxk
论坛版主
论坛版主
  • 注册日期2005-10-03
  • 最后登录2014-04-14
  • 粉丝3
  • 关注1
  • 积分1082分
  • 威望2003点
  • 贡献值0点
  • 好评度1693点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-03-21 11:55
自己思考下~~
该DeviceObject必须是分区级的据说~
没有战争就没有进步 X3工作组 为您提供最好的军火
zealsoft_zhu
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2014-07-30
  • 粉丝2
  • 关注0
  • 积分22分
  • 威望375点
  • 贡献值0点
  • 好评度137点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-21 14:20
直接zwcreatefile打开设备,读就是了,这样更麻烦。
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" );
bizhan123
驱动小牛
驱动小牛
  • 注册日期2006-12-26
  • 最后登录2012-03-19
  • 粉丝0
  • 关注0
  • 积分1002分
  • 威望166点
  • 贡献值0点
  • 好评度125点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-03-21 21:34
兄弟,你这个代码能够防止文件过滤驱动的拦截吗?偶最近也需要读写磁盘扇区
实用信息:www.infozobo.com
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-21 22:58
就是在做文件过滤驱动啊
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-03-22 08:34
用scsi命令去读,不管physical/logical都可以读到,但不管哪种,都必须是storage device object。
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-22 21:55
有办法吗?或能让 4 楼的代码能读U盘的逻辑扇区也行。
shenhui
驱动小牛
驱动小牛
  • 注册日期2006-05-11
  • 最后登录2023-02-10
  • 粉丝14
  • 关注11
  • 积分142分
  • 威望1314点
  • 贡献值1点
  • 好评度146点
  • 原创分0分
  • 专家分1分
  • 社区居民
9楼#
发布于:2007-03-23 18:46
请问楼主,你的这个读扇区的程序第一个参数能不能在文件过滤层获取啊
作一名真实,诚实,优秀的科技工作者!
strpic
驱动小牛
驱动小牛
  • 注册日期2006-11-01
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望238点
  • 贡献值0点
  • 好评度156点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-03-23 21:41
可以,MountVolume 中的 newDevExt->StorageStackDeviceObject
游客

返回顶部