1 /* 2 * Copyright (C) 2004 ReactOS Team 3 * 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: 9 */ 10 11 #include <stdio.h> 12 #include <stdlib.h> 13 #define WIN32_NO_STATUS 14 #include <windows.h> 15 #define NTOS_MODE_USER 16 #include <ndk/ntndk.h> 17 18 #define _NTSCSI_USER_MODE_ 19 #include <ntddscsi.h> 20 #include <scsi.h> 21 22 BOOL GetInquiryData(HANDLE hDevice, PINQUIRYDATA InquiryData) 23 { 24 BOOL Result; 25 DWORD dwReturned; 26 SCSI_ADDRESS ScsiAddress; 27 PSCSI_ADAPTER_BUS_INFO AdapterInfo; 28 PSCSI_INQUIRY_DATA InquiryBuffer; 29 BYTE Buffer[4096]; 30 int i; 31 32 Result = DeviceIoControl(hDevice, 33 IOCTL_SCSI_GET_ADDRESS, 34 NULL, 35 0, 36 &ScsiAddress, 37 sizeof(ScsiAddress), 38 &dwReturned, 39 FALSE); 40 if (Result == FALSE) 41 { 42 return FALSE; 43 } 44 Result = DeviceIoControl(hDevice, 45 IOCTL_SCSI_GET_INQUIRY_DATA, 46 NULL, 47 0, 48 Buffer, 49 sizeof(Buffer), 50 &dwReturned, 51 FALSE); 52 if (Result) 53 { 54 AdapterInfo = (PSCSI_ADAPTER_BUS_INFO)Buffer; 55 for (i = 0; i < AdapterInfo->NumberOfBuses; i++) 56 { 57 InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + AdapterInfo->BusData[i].InquiryDataOffset); 58 if (AdapterInfo->BusData[i].InquiryDataOffset) 59 { 60 while (1) 61 { 62 if (InquiryBuffer->PathId == ScsiAddress.PathId && 63 InquiryBuffer->TargetId == ScsiAddress.TargetId && 64 InquiryBuffer->Lun == ScsiAddress.Lun) 65 { 66 memcpy(InquiryData, InquiryBuffer->InquiryData, sizeof(INQUIRYDATA)); 67 return TRUE; 68 } 69 if (InquiryBuffer->NextInquiryDataOffset == 0) 70 { 71 break; 72 } 73 InquiryBuffer = (PSCSI_INQUIRY_DATA) (Buffer + InquiryBuffer->NextInquiryDataOffset); 74 } 75 } 76 } 77 } 78 return FALSE; 79 } 80 81 82 83 int main(void) 84 { 85 HANDLE hDevice; 86 OVERLAPPED ov; 87 88 PBYTE Buffer = NULL ; 89 DWORD Start; 90 DWORD dwReturned; 91 DWORD dwReadTotal; 92 DWORD Size; 93 BOOL Result; 94 ULONG Drive; 95 CHAR Name[20]; 96 97 INQUIRYDATA InquiryData; 98 99 100 Drive = 0; 101 while (1) 102 { 103 sprintf(Name, "\\\\.\\PHYSICALDRIVE%ld", Drive); 104 hDevice = CreateFile(Name, 105 GENERIC_READ, 106 FILE_SHARE_READ, 107 NULL, 108 OPEN_EXISTING, 109 0, 110 NULL); 111 if (hDevice == INVALID_HANDLE_VALUE) 112 { 113 if (Drive > 0) 114 { 115 VirtualFree(Buffer, 512 * 1024, MEM_RELEASE); 116 } 117 else 118 { 119 printf("Cannot open '%s'\n", Name); 120 } 121 break; 122 } 123 if (Drive == 0) 124 { 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"); 128 129 Buffer = VirtualAlloc(NULL, 512 * 1024, MEM_COMMIT, PAGE_READWRITE); 130 } 131 Result = GetInquiryData(hDevice, &InquiryData); 132 if (Result) 133 { 134 printf("%.24s ", InquiryData.VendorId); 135 } 136 else 137 { 138 printf("Disk %ld ", Drive + 1); 139 } 140 Size = 1024; 141 memset(&ov, 0, sizeof(OVERLAPPED)); 142 while (Size <= 256 * 1024) 143 { 144 memset(Buffer, 0, Size); 145 dwReadTotal = 0; 146 147 Start = GetTickCount() + 2000; 148 while (Start > GetTickCount()) 149 { 150 Result = ReadFile(hDevice, Buffer, Size, &dwReturned, &ov); 151 if (Result) 152 { 153 dwReadTotal += dwReturned; 154 ov.Offset += dwReturned; 155 } 156 } 157 dwReadTotal /= 2048; 158 printf("%3ld.%ld ", dwReadTotal / 1024, (dwReadTotal % 1024) * 10 / 1024); 159 Size *= 2; 160 } 161 printf("\n"); 162 CloseHandle(hDevice); 163 Drive++; 164 } 165 printf("\n"); 166 167 168 return 0; 169 } 170