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

Last change on this file since 5655 was 5587, checked in by sandervl, 24 years ago

added mailslot implemenation, named pipe fixes + FreeLibraryAndExitThread

File size: 8.7 KB
Line 
1/* $Id: hmdisk.cpp,v 1.6 2001-04-26 13:22:45 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 //TODO: check in NT if CREATE_ALWAYS is allowed!!
83 if(pHMHandleData->dwCreation != OPEN_EXISTING) {
84 dprintf(("Invalid creation flags %x!!", pHMHandleData->dwCreation));
85 return ERROR_INVALID_PARAMETER;
86 }
87 if(strncmp(lpFileName, // "support" for local unc names
88 "\\\\.\\",
89 4) == 0)
90 {
91 lpFileName+=4;
92 }
93
94 //Disable error popus. NT allows an app to open a cdrom/dvd drive without a disk inside
95 //OS/2 fails in that case with error ERROR_NOT_READY
96 OSLibDosDisableHardError(TRUE);
97 hFile = OSLibDosCreateFile((LPSTR)lpFileName,
98 pHMHandleData->dwAccess,
99 pHMHandleData->dwShare,
100 (LPSECURITY_ATTRIBUTES)lpSecurityAttributes,
101 pHMHandleData->dwCreation,
102 pHMHandleData->dwFlags,
103 hTemplate);
104 OSLibDosDisableHardError(FALSE);
105
106 if (hFile != INVALID_HANDLE_ERROR || GetLastError() == ERROR_NOT_READY)
107 {
108 if(hFile == INVALID_HANDLE_ERROR) SetLastError(NO_ERROR);
109
110 pHMHandleData->hHMHandle = hFile;
111 pHMHandleData->dwUserData = GetDriveTypeA(lpFileName);
112 return (NO_ERROR);
113 }
114 else {
115 dprintf(("CreateFile failed; error %d", GetLastError()));
116 return(GetLastError());
117 }
118}
119//******************************************************************************
120//******************************************************************************
121BOOL HMDeviceDiskClass::CloseHandle(PHMHANDLEDATA pHMHandleData)
122{
123 if(pHMHandleData->hHMHandle) {
124 return OSLibDosClose(pHMHandleData->hHMHandle);
125 }
126 return TRUE;
127}
128//******************************************************************************
129//******************************************************************************
130BOOL HMDeviceDiskClass::DeviceIoControl(PHMHANDLEDATA pHMHandleData, DWORD dwIoControlCode,
131 LPVOID lpInBuffer, DWORD nInBufferSize,
132 LPVOID lpOutBuffer, DWORD nOutBufferSize,
133 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped)
134{
135 switch(dwIoControlCode)
136 {
137 case FSCTL_DELETE_REPARSE_POINT:
138 case FSCTL_DISMOUNT_VOLUME:
139 case FSCTL_GET_COMPRESSION:
140 case FSCTL_GET_REPARSE_POINT:
141 case FSCTL_LOCK_VOLUME:
142 case FSCTL_QUERY_ALLOCATED_RANGES:
143 case FSCTL_SET_COMPRESSION:
144 case FSCTL_SET_REPARSE_POINT:
145 case FSCTL_SET_SPARSE:
146 case FSCTL_SET_ZERO_DATA:
147 case FSCTL_UNLOCK_VOLUME:
148 case IOCTL_DISK_CHECK_VERIFY:
149 case IOCTL_DISK_EJECT_MEDIA:
150 case IOCTL_DISK_FORMAT_TRACKS:
151 case IOCTL_DISK_GET_DRIVE_GEOMETRY:
152 case IOCTL_DISK_GET_DRIVE_LAYOUT:
153 case IOCTL_DISK_GET_MEDIA_TYPES:
154 case IOCTL_DISK_GET_PARTITION_INFO:
155 case IOCTL_DISK_LOAD_MEDIA:
156 case IOCTL_DISK_MEDIA_REMOVAL:
157 case IOCTL_DISK_PERFORMANCE:
158 case IOCTL_DISK_REASSIGN_BLOCKS:
159 case IOCTL_DISK_SET_DRIVE_LAYOUT:
160 case IOCTL_DISK_SET_PARTITION_INFO:
161 case IOCTL_DISK_VERIFY:
162 case IOCTL_SERIAL_LSRMST_INSERT:
163 case IOCTL_STORAGE_CHECK_VERIFY:
164 case IOCTL_STORAGE_EJECT_MEDIA:
165 case IOCTL_STORAGE_GET_MEDIA_TYPES:
166 case IOCTL_STORAGE_LOAD_MEDIA:
167 case IOCTL_STORAGE_MEDIA_REMOVAL:
168 break;
169 case IOCTL_SCSI_PASS_THROUGH:
170 case IOCTL_SCSI_MINIPORT:
171 case IOCTL_SCSI_GET_INQUIRY_DATA:
172 case IOCTL_SCSI_GET_CAPABILITIES:
173 case IOCTL_SCSI_PASS_THROUGH_DIRECT:
174 break;
175
176 case IOCTL_SCSI_GET_ADDRESS:
177 {
178 HINSTANCE hInstAspi;
179 DWORD (WIN32API *GetASPI32SupportInfo)();
180 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB);
181 DWORD numAdapters, rc;
182 SRB srb;
183 int i, j, k;
184
185 if(!lpOutBuffer || nOutBufferSize < 8) {
186 SetLastError(ERROR_INSUFFICIENT_BUFFER); //todo: right error?
187 return(FALSE);
188 }
189 SCSI_ADDRESS *addr = (SCSI_ADDRESS *)lpOutBuffer;
190 addr->Length = sizeof(SCSI_ADDRESS);
191 addr->PortNumber = 0;
192 addr->PathId = 0;
193 hInstAspi = LoadLibraryA("WNASPI32.DLL");
194 if(hInstAspi == NULL) {
195 SetLastError(ERROR_INVALID_PARAMETER); //todo
196 return FALSE;
197 }
198 *(FARPROC *)&GetASPI32SupportInfo = GetProcAddress(hInstAspi, "GetASPI32SupportInfo");
199 *(FARPROC *)&SendASPI32Command = GetProcAddress(hInstAspi, "SendASPI32Command");
200 numAdapters = GetASPI32SupportInfo();
201 if(LOBYTE(numAdapters) == 0) goto failure;
202
203 memset(&srb, 0, sizeof(srb));
204 srb.common.SRB_Cmd = SC_HA_INQUIRY;
205 rc = SendASPI32Command(&srb);
206
207 for(i=0;i<LOBYTE(numAdapters);i++) {
208 for(j=0;j<8;j++) {
209 for(k=0;k<16;k++) {
210 memset(&srb, 0, sizeof(srb));
211 srb.common.SRB_Cmd = SC_GET_DEV_TYPE;
212 srb.devtype.SRB_HaId = i;
213 srb.devtype.SRB_Target = j;
214 srb.devtype.SRB_Lun = k;
215 rc = SendASPI32Command(&srb);
216 if(rc == SS_COMP) {
217 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM &&
218 pHMHandleData->dwUserData == DRIVE_CDROM)
219 {
220 goto done;
221 }
222 }
223 }
224 }
225 }
226done:
227 if(rc == SS_COMP) {
228 addr->TargetId = j;
229 addr->Lun = k;
230 SetLastError(ERROR_SUCCESS);
231 }
232 else SetLastError(ERROR_FILE_NOT_FOUND); //todo
233 FreeLibrary(hInstAspi);
234 return TRUE;
235failure:
236 FreeLibrary(hInstAspi);
237 SetLastError(ERROR_INVALID_PARAMETER); //todo
238 return FALSE;
239 }
240
241 case IOCTL_SCSI_RESCAN_BUS:
242 case IOCTL_SCSI_GET_DUMP_POINTERS:
243 case IOCTL_SCSI_FREE_DUMP_POINTERS:
244 case IOCTL_IDE_PASS_THROUGH:
245 break;
246
247 }
248 dprintf(("HMDeviceDiskClass::DeviceIoControl: unimplemented dwIoControlCode=%08lx\n", dwIoControlCode));
249 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
250 return FALSE;
251}
252//******************************************************************************
253//******************************************************************************
Note: See TracBrowser for help on using the repository browser.