首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > windows >

如何读取MBR扇区

2012-12-15 
怎么读取MBR扇区各位好:下面是一段在内核读取U盘扇区的代码,它只能读到DBR信息,怎么能读到MBR的信息呢?读

怎么读取MBR扇区
各位好:

     下面是一段在内核读取U盘扇区的代码,它只能读到DBR信息,怎么能读到MBR的信息呢?

      读取的时机是U盘MOUNT的时候。

       storageStackDeviceObject = irpSp->Parameters.MountVolume.Vpb->RealDevice;//

       BusType = BusType(storageStackDeviceObject);//获取总线类型

       if (7 == BusType)
       {
int i = 0;
UCHAR buffer[512] = {0};
TyReadSectorZero(storageStackDeviceObject,buffer,512);
       }
//FUNCTION

      NTSTATUS TyReadSectorZero_1(PDEVICE_OBJECT DeviceObject, PVOID Buffer,ULONG Length)
{
KEVENT event;
NTSTATUS ntstatus = STATUS_SUCCESS;
//初始化事件
KeInitializeEvent(&event, NotificationEvent, FALSE);

//取得中断级别,判断是否可用IoBuildSynchronousFsdRequest
if(KeGetCurrentIrql() <= APC_LEVEL)
{
PIRP pReadIrp;
LARGE_INTEGER lioffset = {0};
IO_STATUS_BLOCK ioblock = {0};

//调用IoBuildSynchronousFsdRequest构造IRP包,返回值即为指向IRP的指针.
pReadIrp = IoBuildSynchronousFsdRequest(IRP_MJ_READ, 
                                                           DeviceObject,
                                                           Buffer, 
                                                           Length, 
                                                           &lioffset, 
                                                           &event,
                                                           &ioblock);
//构造IRP包失败
if(0 == pReadIrp)
{
KdPrint(("IoBuildSynchronousFsdRequest fail! \n"));
goto _end;
}

//发送IRP
ntstatus = IoCallDriver(DeviceObject, pReadIrp);

//等待事件
if(STATUS_PENDING == ntstatus)


{
KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, 0);
}

if(ioblock.Information == 0)  
{
goto _end;
}
}
_end:
return ntstatus;
}

上面的代码读取DBR的信息时没什么问题的,但是我想读取MBR的信息,怎么读?谢谢

[解决办法]
应该是设备对象的参数传的不对DeviceObject,该传什么呢?
或者是读取的时机不对?
[解决办法]
...用ring3就可以直接读取了,不需要ring0,CreateFile直接打开硬盘,不过能不能写入我就不知道了。。。
[解决办法]
谢谢!
我需要在内核读取来判断ring3层有没有对它做改变。
[解决办法]
在ring3层已经可以对扇区读写了,由于设计的需要我仍需要在ring0层完成读写功能!
[解决办法]
看看你打开U盘的方式 逻辑打开肯定读不到MBR,要物理打开盘才可以 虽然都是读第一个扇区
[解决办法]
在ring3层可以通过参数来确定打开是逻辑磁盘还是物理磁盘
"\\\\.\\PhysicalDrive1"; "\\\\.\\J:";
在内核怎么区别呢?谢谢

[解决办法]
看看。mbr引导做的对嘛?


[解决办法]
路过,学习中
[解决办法]
路过。。。。。。。。。
[解决办法]
实模式可以用内嵌汇编,int 13h读写磁盘。保护模式内核中没有研究过,楼主可以查下。
[解决办法]
谢谢,各位,我用其他方式解决了,有需要找我QQ:33228371

热点排行