2 * Copyright (C) 2004 ReactOS Team
4 * COPYRIGHT: See COPYING in the top level directory
5 * PROJECT: ReactOS diskspeed.exe
6 * FILE: apps/tests/diskspeed/diskspeed.c
7 * PURPOSE: Determines disk transfer rates
13 #define WIN32_NO_STATUS
15 #define NTOS_MODE_USER
16 #include <ndk/ntndk.h>
18 #define _NTSCSI_USER_MODE_
22 BOOL
GetInquiryData(HANDLE hDevice
, PINQUIRYDATA InquiryData
)
26 SCSI_ADDRESS ScsiAddress
;
27 PSCSI_ADAPTER_BUS_INFO AdapterInfo
;
28 PSCSI_INQUIRY_DATA InquiryBuffer
;
32 Result
= DeviceIoControl(hDevice
,
33 IOCTL_SCSI_GET_ADDRESS
,
44 Result
= DeviceIoControl(hDevice
,
45 IOCTL_SCSI_GET_INQUIRY_DATA
,
54 AdapterInfo
= (PSCSI_ADAPTER_BUS_INFO
)Buffer
;
55 for (i
= 0; i
< AdapterInfo
->NumberOfBuses
; i
++)
57 InquiryBuffer
= (PSCSI_INQUIRY_DATA
) (Buffer
+ AdapterInfo
->BusData
[i
].InquiryDataOffset
);
58 if (AdapterInfo
->BusData
[i
].InquiryDataOffset
)
62 if (InquiryBuffer
->PathId
== ScsiAddress
.PathId
&&
63 InquiryBuffer
->TargetId
== ScsiAddress
.TargetId
&&
64 InquiryBuffer
->Lun
== ScsiAddress
.Lun
)
66 memcpy(InquiryData
, InquiryBuffer
->InquiryData
, sizeof(INQUIRYDATA
));
69 if (InquiryBuffer
->NextInquiryDataOffset
== 0)
73 InquiryBuffer
= (PSCSI_INQUIRY_DATA
) (Buffer
+ InquiryBuffer
->NextInquiryDataOffset
);
97 INQUIRYDATA InquiryData
;
103 sprintf(Name
, "\\\\.\\PHYSICALDRIVE%ld", Drive
);
104 hDevice
= CreateFile(Name
,
111 if (hDevice
== INVALID_HANDLE_VALUE
)
115 VirtualFree(Buffer
, 512 * 1024, MEM_RELEASE
);
119 printf("Cannot open '%s'\n", Name
);
125 printf("Transfer Size (kB) 1 2 4 8 16 32 64 128 256\n");
126 printf("Transfer Rate (MB/s)\n");
127 printf("-------------------------------------------------------------------------------\n");
129 Buffer
= VirtualAlloc(NULL
, 512 * 1024, MEM_COMMIT
, PAGE_READWRITE
);
131 Result
= GetInquiryData(hDevice
, &InquiryData
);
134 printf("%.24s ", InquiryData
.VendorId
);
138 printf("Disk %ld ", Drive
+ 1);
141 memset(&ov
, 0, sizeof(OVERLAPPED
));
142 while (Size
<= 256 * 1024)
144 memset(Buffer
, 0, Size
);
147 Start
= GetTickCount() + 2000;
148 while (Start
> GetTickCount())
150 Result
= ReadFile(hDevice
, Buffer
, Size
, &dwReturned
, &ov
);
153 dwReadTotal
+= dwReturned
;
154 ov
.Offset
+= dwReturned
;
158 printf("%3ld.%ld ", dwReadTotal
/ 1024, (dwReadTotal
% 1024) * 10 / 1024);
162 CloseHandle(hDevice
);