Windows NT以上系统异步读写硬盘的方法
2016-06-20 00:00
309 查看
今日整理硬盘无意发现刚学windows编程时写的一段代码,用于在windows下异步读写硬盘用的.
可能网上已经有类似的代码了,小弟在发一次,希望别有人用这做坏事.
打开硬盘有两个东西要知道,第一打开的文件名:\\\\.\\PHYSICALDRIVE0, 0代表第一块硬盘,依次1代表第二块硬盘...第二打开硬盘使用的参数OPEN_EXISTING是不可少的,至于为什么查MSDN.
先把代码发上来大家看看,读写速度还可以几秒就1G了,有空改成完成端口不知道会不会快点.
(注意以下代码不要用\\\\.\\PHYSICALDRIVE0试验,会把硬盘时的第一个G内容写成0,后果可想而知)
1
#include
<
Windows.h
>
2
3
VOID CALLBACK MyIOCompletion(DWORD dwErrorCode,
4
DWORD dwNumberOfBytesTransfered,
5
LPOVERLAPPED lpOverlapped
6
);
7
8
BOOL ReadHardDisk(
char
*
disk);
9
10
int
__stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN
int
nShowCmd )
11
{
12
//
ReadHardDisk("\\\\.\\PHYSICALDRIVE0");
13
ReadHardDisk(
"
C:\\a.dat
"
);
//
如果要试试,先建立文件,要不会出错
14
15
16
17
return
0
;
18
}
19
20
VOID CALLBACK MyIOCompletion(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped )
21
{
22
//
TRACE("write disk succeed.");
23
}
24
25
BOOL ReadHardDisk(
char
*
disk)
26
{
27
HANDLE hHead;
28
29
hHead
=
CreateFile(disk, GENERIC_WRITE, FILE_SHARE_WRITE,
30
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
31
if
(INVALID_HANDLE_VALUE
==
hHead)
32
{
33
return
FALSE;
34
}
35
36
BYTE
*
pbWrite
=
new
BYTE[
1024
*
1024
];
//
1M
37
OVERLAPPED overlap;
38
39
40
for
(
int
i
=
0
; i
<
1024
; i
++
)
//
1024 也就是 1G
41
{
42
overlap.Offset
=
(
1024
*
1024
)
*
i;
43
overlap.OffsetHigh
=
0
;
44
overlap.hEvent
=
NULL;
45
WriteFileEx(hHead, pbWrite,
1024
*
1024
,
&
overlap, MyIOCompletion);
46
while
(WAIT_IO_COMPLETION
!=
SleepEx(
0
, TRUE))
//
在这里可能加点东西做点别的事情
47
{
48
Sleep(
0
);
//
切换下时钟
49
}
50
}
51
52
CloseHandle(hHead);
53
delete pbWrite;
54
55
return
TRUE;
56
}
57
可能网上已经有类似的代码了,小弟在发一次,希望别有人用这做坏事.
打开硬盘有两个东西要知道,第一打开的文件名:\\\\.\\PHYSICALDRIVE0, 0代表第一块硬盘,依次1代表第二块硬盘...第二打开硬盘使用的参数OPEN_EXISTING是不可少的,至于为什么查MSDN.
先把代码发上来大家看看,读写速度还可以几秒就1G了,有空改成完成端口不知道会不会快点.
(注意以下代码不要用\\\\.\\PHYSICALDRIVE0试验,会把硬盘时的第一个G内容写成0,后果可想而知)
1
#include
<
Windows.h
>
2
3
VOID CALLBACK MyIOCompletion(DWORD dwErrorCode,
4
DWORD dwNumberOfBytesTransfered,
5
LPOVERLAPPED lpOverlapped
6
);
7
8
BOOL ReadHardDisk(
char
*
disk);
9
10
int
__stdcall WinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, IN LPSTR lpCmdLine, IN
int
nShowCmd )
11
{
12
//
ReadHardDisk("\\\\.\\PHYSICALDRIVE0");
13
ReadHardDisk(
"
C:\\a.dat
"
);
//
如果要试试,先建立文件,要不会出错
14
15
16
17
return
0
;
18
}
19
20
VOID CALLBACK MyIOCompletion(DWORD dwErrorCode, DWORD dwNumberOfBytesTransfered, LPOVERLAPPED lpOverlapped )
21
{
22
//
TRACE("write disk succeed.");
23
}
24
25
BOOL ReadHardDisk(
char
*
disk)
26
{
27
HANDLE hHead;
28
29
hHead
=
CreateFile(disk, GENERIC_WRITE, FILE_SHARE_WRITE,
30
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
31
if
(INVALID_HANDLE_VALUE
==
hHead)
32
{
33
return
FALSE;
34
}
35
36
BYTE
*
pbWrite
=
new
BYTE[
1024
*
1024
];
//
1M
37
OVERLAPPED overlap;
38
39
40
for
(
int
i
=
0
; i
<
1024
; i
++
)
//
1024 也就是 1G
41
{
42
overlap.Offset
=
(
1024
*
1024
)
*
i;
43
overlap.OffsetHigh
=
0
;
44
overlap.hEvent
=
NULL;
45
WriteFileEx(hHead, pbWrite,
1024
*
1024
,
&
overlap, MyIOCompletion);
46
while
(WAIT_IO_COMPLETION
!=
SleepEx(
0
, TRUE))
//
在这里可能加点东西做点别的事情
47
{
48
Sleep(
0
);
//
切换下时钟
49
}
50
}
51
52
CloseHandle(hHead);
53
delete pbWrite;
54
55
return
TRUE;
56
}
57
相关文章推荐
- 权限提升代码
- 用DirectX Audio和DirectShow播放声音和音乐(2)
- 迷失[转载]
- 关于成员函数的Command模式的简单实现
- 360与QQ共存方法
- 这是我向往的生活
- 水煮TCPMP (转)
- 初始化Direct3D(4)
- 再次推荐一款War3 MH:VSMapHack 6.05
- 使用UltraEdit实现从DOS文件到UNIX文件的批量转换
- Windows调试器及不同平台符号包下载地址(收集)
- 在桌面上显示屏保
- D3D编程必备的数学知识(1)
- C++位运算
- Nebula3学习笔记(6): 网络系统
- 权限提升代码
- D3D中的Alpha颜色混合(3)
- 360与QQ共存方法
- D3D中的粒子系统(6)
- 这是我向往的生活