CreateFile打开物理磁盘失败,失败返回代码87,为什么呢?

erqerq126 2011-02-05 07:05:59

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile=CreateFile("\\\\.\\PhysicalDrive0",GENERIC_READ,
FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hFile){
printf("open error %d\n",GetLastError());
}
return 0;
}


运行输出:
open error 87
Press any key to continue
...全文
490 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fishion 2011-02-05
  • 打赏
  • 举报
回复
You can use the CreateFile function to open a physical disk drive or a volume. The function returns a handle that can be used with the DeviceIoControl function. This enables you to access the disk partition table. However, it is potentially dangerous to do so, because an incorrect write to a disk could make its contents inaccessible. The following requirements must be met for such a call to succeed:

应该不能用ReadFile了,要用DeviceIoControl
erqerq126 2011-02-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fishion 的回复:]
MSDN中CreateFile下面的标题为“Physical Disks and Volumes”里面就有例子了
[/Quote]

谢谢,但是接下来用ReadFile的话,什么也读不出来

#include <windows.h>
#include <stdio.h>
int main() {
HANDLE hFile=CreateFile("\\\\.\\PhysicalDrive0", // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL);
if(INVALID_HANDLE_VALUE==hFile){
printf("open error %d\n",GetLastError());
}
char buf[256];
DWORD nread;
ReadFile(hFile,buf,255,&nread,NULL);
return 0;//GENERIC_READ
}


用debug运行到return 0的时候,buf的内容全都是0xcccccccc这样的内容,似乎什么也读不到啊
这是怎么回事呢?

谢谢!
fishion 2011-02-05
  • 打赏
  • 举报
回复
MSDN中CreateFile下面的标题为“Physical Disks and Volumes”里面就有例子了
erqerq126 2011-02-05
  • 打赏
  • 举报
回复
我打开物理磁盘就是想读出前导区当中的内容
MSDN的解释
0 Specifies device query access to the object. An application can query device attributes without accessing the device.

这个0参数只能读取设备属性,不能用于读啊。要读的话,岂不是还是要用GENERIC_READ参数呢
erqerq126 2011-02-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 fishion 的回复:]
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hFile=CreateFile("\\\\.\\PhysicalDrive0", // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE……
[/Quote]
高人,为什么第二个参数必须是:
0, // no access to the drive

而不能是GENERIC_READ呢? 我在MSDN里面没有找到这个读写PhsicalDrive0的例子啊,使哪个api的例子?
谢谢!
fishion 2011-02-05
  • 打赏
  • 举报
回复
#include <windows.h>
#include <stdio.h>
int main()
{
HANDLE hFile=CreateFile("\\\\.\\PhysicalDrive0", // drive to open
0, // no access to the drive
FILE_SHARE_READ | // share mode
FILE_SHARE_WRITE,
NULL, // default security attributes
OPEN_EXISTING, // disposition
0, // file attributes
NULL);
if(INVALID_HANDLE_VALUE==hFile){
printf("open error %d\n",GetLastError());
}
return 0;

MSDN上面有
使用 易语言 进行硬盘操作,获取硬盘大小。 已经测试的操作系统:{ WINDOWS XP SP3 WINDOWS 7 X64 SP1 WINDOWS 2008 X64 } 其中包含的知识点: 【1】:CreateFile()打开物理驱动器操作,固定格式:“ \\.\PhysicalDrive X”其中X为驱动器的序号。(注意,C语言中\需要转义); 打开后会返回操作的句柄,就可以根据这个句柄进行操作了。关于CreateFile函数, 请点击这里查看 由于我们这里进行的是读取信息的操作,所以打开权限为“#GENERIC_READ”只读,同时将Flag置为:#OPEN_EXISTING,表示打开存在的。 这里需要注意一点, 如果CreateFile函数执行失败返回值为:INVALID_HANDLE_VALUE,他的值为-1,而不是0; 【2】:进行过打开之后,就要获取硬盘的信息了,使用API函数:DeviceIoControl,关于更具体的使用方法,请参见MSDN,点击这里( 高能,英语不好者慎入 )。 使用“#IOCTL_DISK_GET_LENGTH_INFO”可以告知,我们将要获取磁盘的长度,也就是大小。 下面是具体分析: BOOL DeviceIoControl( (HANDLE) hDevice, // handle to device 句柄 IOCTL_DISK_GET_LENGTH_INFO, // dwIoControlCode 操作的代码 NULL, //忽略 0, //忽略 (LPVOID) lpOutBuffer, // output buffer 输出数据的缓冲区 (DWORD) nOutBufferSize, // size of output buffer 缓冲区的长度 (LPDWORD) lpBytesReturned, // number of bytes returned 可以忽略 (LPOVERLAPPED) lpOverlapped // OVERLAPPED structure 忽略 ); 复制代码 ps:上面这个“代码”编辑的功能还真是难用。 pOutBuffer 需要的是 GET_LENGTH_INFORMATION 结构体的地址(点击查看详情) ,在易语言中使用“长整数”即可,同时将该参数的DLL声明选中“传址”以完成传递地址。 使用“ 取数据类型尺寸 (#长整数型)”获取长整数在内存中占用的尺寸。并传递给参数: nOutBufferSize; 【3】完成上述操作后,只需要对 DeviceIoControl的返回值进行判断,如果为0则为失败,调用取错误信息,然后释放句柄,函数返回。 如果获取成功,则返回长整数。 至此:函数运行完毕。
易语言API获取“物理硬盘”总大小 使用易语言进行硬盘操作,获取硬盘大小。 已经测试的操作系统:{ WINDOWS XP SP3 WINDOWS 7 X64 SP1 WINDOWS 2008 X64 } 其中包含的知识点: 【1】:CreateFile()打开物理驱动器操作,固定格式:“\\.\PhysicalDriveX”其中X为驱动器的序号。(注意,C语言中\需要转义); 打开后会返回操作的句柄,就可以根据这个句柄进行操作了。关于CreateFile函数,请点击这里查看 由于我们这里进行的是读取信息的操作,所以打开权限为“#GENERIC_READ”只读,同时将Flag置为:#OPEN_EXISTING,表示打开存在的。 这里需要注意一点,如果CreateFile函数执行失败返回值为:INVALID_HANDLE_VALUE,他的值为-1,而不是0; 【2】:进行过打开之后,就要获取硬盘的信息了,使用API函数:DeviceIoControl,关于更具体的使用方法,请参见MSDN,点击这里(高能,英语不好者慎入)。 使用“#IOCTL_DISK_GET_LENGTH_INFO”可以告知,我们将要获取磁盘的长度,也就是大小。 下面是具体分析: BOOL DeviceIoControl( (HANDLE) hDevice,             // handle to device   句柄 IOCTL_DISK_GET_LENGTH_INFO,   // dwIoControlCode    操作的代码 NULL,                            //忽略 0,                                  //忽略 (LPVOID) lpOutBuffer,         // output buffer      输出数据的缓冲区 (DWORD) nOutBufferSize,      // size of output buffer   缓冲区的长度 (LPDWORD) lpBytesReturned,    // number of bytes returned    可以忽略 (LPOVERLAPPED) lpOverlapped   // OVERLAPPED structure       忽略 ); 复制代码 ps:上面这个“代码”编辑的功能还真是难用。 pOutBuffer 需要的是GET_LENGTH_INFORMATION结构体的地址(点击查看详情),在易语言中使用“长整数”即可,同时将该参数的DLL声明选中“传址”以完成传递地址。 使用“取数据类型尺寸 (#长整数型)”获取长整数在内存中占用的尺寸。并传递给参数:nOutBufferSize; 【3】完成上述操作后,只需要对DeviceIoControl的返回值进行判断,如果为0则为失败,调用取错误信息,然后释放句柄,函数返回。 如果获取成功,则返回长整数。 至此:函数运行完毕。

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧