source: trunk/src/kernel32/hmdisk.cpp@ 4588

Last change on this file since 4588 was 4588, checked in by sandervl, 25 years ago

Handlemanager fix (MN), changes for device name lookup, com bugfix (error check) + com class now called for COMx: names

File size: 8.0 KB
Line 
1/* $Id: hmdisk.cpp,v 1.4 2000-11-14 14:27:02 sandervl Exp $ */
2
3/*
4 * Win32 Disk API functions for OS/2
5 *
6 * Copyright 2000 Sander van Leeuwen
7 *
8 *
9 * Project Odin Software License can be found in LICENSE.TXT
10 *
11 */
12#include <os2win.h>
13#include <string.h>
14
15#include <misc.h>
16#include "hmdisk.h"
17#include "oslibdos.h"
18#include <win\winioctl.h>
19#include <win\ntddscsi.h>
20#include <win\wnaspi32.h>
21#include <win\aspi.h>
22
23#define DBG_LOCALLOG DBG_hmdisk
24#include "dbglocal.h"
25
26HMDeviceDiskClass::HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName)
27{
28 HMDeviceRegisterEx("\\\\.\\PHYSICALDRIVE", this, NULL);
29}
30
31/*****************************************************************************
32 * Name : HMDeviceDiskClass::FindDevice
33 * Purpose : Checks if lpDeviceName belongs to this device class
34 * Parameters: LPCSTR lpClassDevName
35 * LPCSTR lpDeviceName
36 * int namelength
37 * Variables :
38 * Result : checks if name is for a drive of physical disk
39 * Remark :
40 * Status :
41 *
42 * Author : SvL
43 *****************************************************************************/
44BOOL HMDeviceDiskClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength)
45{
46 //\\.\\x: -> length 6
47 //\\.\PHYSICALDRIVEn -> length 18
48 if(namelength != 6 && namelength != 18) {
49 return FALSE;
50 }
51
52 //SvL: \\.\x: -> drive x (i.e. \\.\C:)
53 // \\.\PHYSICALDRIVEn -> drive n (n>=0)
54 if((strncmp(lpDeviceName, "\\\\.\\", 4) == 0) &&
55 namelength == 6 && lpDeviceName[5] == ':')
56 {
57 return TRUE;
58 }
59 if((strncmp(lpDeviceName, "\\\\.\\PHYSICALDRIVE", 17) == 0) && namelength == 18) {
60 return TRUE;
61 }
62 return FALSE;
63}
64//******************************************************************************
65//TODO: PHYSICALDRIVEn!!
66//******************************************************************************
67DWORD HMDeviceDiskClass::CreateFile (LPCSTR lpFileName,
68 PHMHANDLEDATA pHMHandleData,
69 PVOID lpSecurityAttributes,
70 PHMHANDLEDATA pHMHandleDataTemplate)
71{
72 HFILE hFile;
73 HFILE hTemplate;
74
75 dprintf2(("KERNEL32: HMDeviceDiskClass::CreateFile %s(%s,%08x,%08x,%08x)\n",
76 lpHMDeviceName,
77 lpFileName,
78 pHMHandleData,
79 lpSecurityAttributes,
80 pHMHandleDataTemplate));
81
82 if(strncmp(lpFileName, // "support" for local unc names
83 "\\\\.\\",
84 4) == 0)
85 {
86 lpFileName+=4;
87 }
88
89 hFile = OSLibDosCreateFile((LPSTR)lpFileName,
90 pHMHandleData->dwAccess,
91 pHMHandleData->dwShare,
92 (LPSECURITY_ATTRIBUTES)lpSecurityAttributes,
93 pHMHandleData->dwCreation,
94 pHMHandleData->dwFlags,
95 hTemplate);
96
97 if (hFile != INVALID_HANDLE_ERROR)
98 {
99 pHMHandleData->hHMHandle = hFile;
100 pHMHandleData->dwUserData = GetDriveTypeA(lpFileName);
101 return (NO_ERROR);
102 }
103 else {
104 dprintf(("CreateFile failed; error %d", GetLastError()));
105 return(GetLastError());
106 }
107}
108//******************************************************************************
109//******************************************************************************
110DWORD HMDeviceDiskClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
111{
112 return OSLibDosClose(pHMHandleData->hHMHandle);
113}
114//******************************************************************************
115//******************************************************************************
116BOOL HMDeviceDiskClass::DeviceIoControl(PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode,
117 LPVOID lpInBuffer, DWORD nInBufferSize,
118 LPVOID lpOutBuffer, DWORD nOutBufferSize,
119 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
120{
121 switch(dwIoControlCode)
122 {
123 case FSCTL_DELETE_REPARSE_POINT:
124 case FSCTL_DISMOUNT_VOLUME:
125 case FSCTL_GET_COMPRESSION:
126 case FSCTL_GET_REPARSE_POINT:
127 case FSCTL_LOCK_VOLUME:
128 case FSCTL_QUERY_ALLOCATED_RANGES:
129 case FSCTL_SET_COMPRESSION:
130 case FSCTL_SET_REPARSE_POINT:
131 case FSCTL_SET_SPARSE:
132 case FSCTL_SET_ZERO_DATA:
133 case FSCTL_UNLOCK_VOLUME:
134 case IOCTL_DISK_CHECK_VERIFY:
135 case IOCTL_DISK_EJECT_MEDIA:
136 case IOCTL_DISK_FORMAT_TRACKS:
137 case IOCTL_DISK_GET_DRIVE_GEOMETRY:
138 case IOCTL_DISK_GET_DRIVE_LAYOUT:
139 case IOCTL_DISK_GET_MEDIA_TYPES:
140 case IOCTL_DISK_GET_PARTITION_INFO:
141 case IOCTL_DISK_LOAD_MEDIA:
142 case IOCTL_DISK_MEDIA_REMOVAL:
143 case IOCTL_DISK_PERFORMANCE:
144 case IOCTL_DISK_REASSIGN_BLOCKS:
145 case IOCTL_DISK_SET_DRIVE_LAYOUT:
146 case IOCTL_DISK_SET_PARTITION_INFO:
147 case IOCTL_DISK_VERIFY:
148 case IOCTL_SERIAL_LSRMST_INSERT:
149 case IOCTL_STORAGE_CHECK_VERIFY:
150 case IOCTL_STORAGE_EJECT_MEDIA:
151 case IOCTL_STORAGE_GET_MEDIA_TYPES:
152 case IOCTL_STORAGE_LOAD_MEDIA:
153 case IOCTL_STORAGE_MEDIA_REMOVAL:
154 break;
155 case IOCTL_SCSI_PASS_THROUGH:
156 case IOCTL_SCSI_MINIPORT:
157 case IOCTL_SCSI_GET_INQUIRY_DATA:
158 case IOCTL_SCSI_GET_CAPABILITIES:
159 case IOCTL_SCSI_PASS_THROUGH_DIRECT:
160 break;
161
162 case IOCTL_SCSI_GET_ADDRESS:
163 {
164 HINSTANCE hInstAspi;
165 DWORD (WIN32API *GetASPI32SupportInfo)();
166 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
167 DWORD numAdapters, rc;
168 SRB srb;
169 int i, j, k;
170
171 if(!lpOutBuffer || nOutBufferSize < 8) {
172 SetLastError(ERROR_INSUFFICIENT_BUFFER); //todo: right error?
173 return(FALSE);
174 }
175 SCSI_ADDRESS *addr = (SCSI_ADDRESS *)lpOutBuffer;
176 addr->Length = sizeof(SCSI_ADDRESS);
177 addr->PortNumber = 0;
178 addr->PathId = 0;
179 hInstAspi = LoadLibraryA("WNASPI32.DLL");
180 if(hInstAspi == NULL) {
181 SetLastError(ERROR_INVALID_PARAMETER); //todo
182 return FALSE;
183 }
184 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
185 *(FARPROC *)&SendASPI32Command = GetProcAddress(hInstAspi, "SendASPI32Command");
186 numAdapters = GetASPI32SupportInfo();
187 if(LOBYTE(numAdapters) == 0) goto failure;
188
189 memset(&srb, 0, sizeof(srb));
190 srb.common.SRB_Cmd = SC_HA_INQUIRY;
191 rc = SendASPI32Command(&srb);
192
193 for(i=0;i<LOBYTE(numAdapters);i++) {
194 for(j=0;j<8;j++) {
195 for(k=0;k<16;k++) {
196 memset(&srb, 0, sizeof(srb));
197 srb.common.SRB_Cmd = SC_GET_DEV_TYPE;
198 srb.devtype.SRB_HaId = i;
199 srb.devtype.SRB_Target = j;
200 srb.devtype.SRB_Lun = k;
201 rc = SendASPI32Command(&srb);
202 if(rc == SS_COMP) {
203 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
204 pHMHandleData->dwUserData == DRIVE_CDROM)
205 {
206 goto done;
207 }
208 }
209 }
210 }
211 }
212done:
213 if(rc == SS_COMP) {
214 addr->TargetId = j;
215 addr->Lun = k;
216 SetLastError(ERROR_SUCCESS);
217 }
218 else SetLastError(ERROR_FILE_NOT_FOUND); //todo
219 FreeLibrary(hInstAspi);
220 return TRUE;
221failure:
222 FreeLibrary(hInstAspi);
223 SetLastError(ERROR_INVALID_PARAMETER); //todo
224 return FALSE;
225 }
226
227 case IOCTL_SCSI_RESCAN_BUS:
228 case IOCTL_SCSI_GET_DUMP_POINTERS:
229 case IOCTL_SCSI_FREE_DUMP_POINTERS:
230 case IOCTL_IDE_PASS_THROUGH:
231 break;
232
233 }
234 dprintf(("HMDeviceDiskClass::DeviceIoControl: unimplemented dwIoControlCode=%08lx\n", dwIoControlCode));
235 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
236 return FALSE;
237}
238//******************************************************************************
239//******************************************************************************
Note: See TracBrowser for help on using the repository browser.