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
8 * PROGRAMMER: Hartmut Birr
14 #include <ddk/ntddk.h>
15 #include <ddk/ntddscsi.h>
18 BOOL
GetInquiryData(HANDLE hDevice
, PINQUIRYDATA InquiryData
)
22 SCSI_ADDRESS ScsiAddress
;
23 PSCSI_ADAPTER_BUS_INFO AdapterInfo
;
24 PSCSI_INQUIRY_DATA InquiryBuffer
;
28 Result
= DeviceIoControl(hDevice
,
29 IOCTL_SCSI_GET_ADDRESS
,
40 Result
= DeviceIoControl(hDevice
,
41 IOCTL_SCSI_GET_INQUIRY_DATA
,
50 AdapterInfo
= (PSCSI_ADAPTER_BUS_INFO
)Buffer
;
51 for (i
= 0; i
< AdapterInfo
->NumberOfBuses
; i
++)
53 InquiryBuffer
= (PSCSI_INQUIRY_DATA
) (Buffer
+ AdapterInfo
->BusData
[i
].InquiryDataOffset
);
54 if (AdapterInfo
->BusData
[i
].InquiryDataOffset
)
58 if (InquiryBuffer
->PathId
== ScsiAddress
.PathId
&&
59 InquiryBuffer
->TargetId
== ScsiAddress
.TargetId
&&
60 InquiryBuffer
->Lun
== ScsiAddress
.Lun
)
62 memcpy(InquiryData
, InquiryBuffer
->InquiryData
, sizeof(INQUIRYDATA
));
65 if (InquiryBuffer
->NextInquiryDataOffset
== 0)
69 InquiryBuffer
= (PSCSI_INQUIRY_DATA
) (Buffer
+ InquiryBuffer
->NextInquiryDataOffset
);
93 INQUIRYDATA InquiryData
;
99 sprintf(Name
, "\\\\.\\PHYSICALDRIVE%ld", Drive
);
100 hDevice
= CreateFile(Name
,
107 if (hDevice
== INVALID_HANDLE_VALUE
)
111 VirtualFree(Buffer
, 512 * 1024, MEM_RELEASE
);
115 printf("Cannot open '%s'\n", Name
);
121 printf("Transfer Size (kB) 1 2 4 8 16 32 64 128 256\n");
122 printf("Transfer Rate (MB/s)\n");
123 printf("-------------------------------------------------------------------------------\n");
125 Buffer
= VirtualAlloc(NULL
, 512 * 1024, MEM_COMMIT
, PAGE_READWRITE
);
127 Result
= GetInquiryData(hDevice
, &InquiryData
);
130 printf("%.24s ", InquiryData
.VendorId
);
134 printf("Disk %ld ", Drive
+ 1);
137 memset(&ov
, 0, sizeof(OVERLAPPED
));
138 while (Size
<= 256 * 1024)
140 memset(Buffer
, 0, Size
);
143 Start
= GetTickCount() + 2000;
144 while (Start
> GetTickCount())
146 Result
= ReadFile(hDevice
, Buffer
, Size
, &dwReturned
, &ov
);
149 dwReadTotal
+= dwReturned
;
150 ov
.Offset
+= dwReturned
;
154 printf("%3ld.%ld ", dwReadTotal
/ 1024, (dwReadTotal
% 1024) * 10 / 1024);
158 CloseHandle(hDevice
);