- Timestamp:
- Nov 14, 2000, 3:27:04 PM (25 years ago)
- Location:
- trunk/src/kernel32
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/HandleManager.cpp
r4487 r4588 1 /* $Id: HandleManager.cpp,v 1.5 3 2000-10-16 17:56:08sandervl Exp $ */1 /* $Id: HandleManager.cpp,v 1.54 2000-11-14 14:26:55 sandervl Exp $ */ 2 2 3 3 /* … … 177 177 { 178 178 PHMDEVICE pHMDevice; /* iterator over the device table */ 179 180 if (pszDeviceName != NULL) { 179 int namelength = strlen(pszDeviceName); 180 181 if (pszDeviceName != NULL) 182 { 181 183 for (pHMDevice = TabWin32Devices; /* loop over all devices in the table */ 182 184 pHMDevice != NULL; 183 185 pHMDevice = pHMDevice->pNext) 184 186 { 185 if (stricmp(pHMDevice->pszDeviceName, /* case-insensitive search */ 186 pszDeviceName) == 0) 187 return (pHMDevice->pDeviceHandler); /* OK, we've found our device */ 187 if(pHMDevice->pDeviceHandler->FindDevice(pHMDevice->pszDeviceName, pszDeviceName, namelength) == TRUE) 188 { 189 return pHMDevice->pDeviceHandler; 190 } 188 191 } 189 192 } 190 int namelength = strlen(pszDeviceName);191 192 //SvL: \\.\x: -> drive x (i.e. \\.\C:)193 // \\.\PHYSICALDRIVEn -> drive n (n>=0)194 if((strncmp(pszDeviceName, "\\\\.\\", 4) == 0) &&195 namelength == 6 && pszDeviceName[5] == ':')196 {197 return HMGlobals.pHMDisk;198 }199 if((strncmp(pszDeviceName, "\\\\.\\PHYSICALDRIVE", 17) == 0) && namelength == 18) {200 return HMGlobals.pHMDisk;201 }202 203 193 return (HMGlobals.pHMOpen32); /* haven't found anything, return default */ 204 194 } … … 219 209 { 220 210 PHMDEVICE pHMDevice; /* iterator over the device table */ 211 int namelength = strlen(pszDeviceName); 221 212 222 213 if (pszDeviceName != NULL) 214 { 223 215 for (pHMDevice = TabWin32Devices; /* loop over all devices in the table */ 224 216 pHMDevice != NULL; 225 217 pHMDevice = pHMDevice->pNext) 226 218 { 227 if (stricmp(pHMDevice->pszDeviceName, /* case-insensitive search */ 228 pszDeviceName) == 0) 229 return (pHMDevice->pDevData); /* OK, we've found our device */ 219 if(pHMDevice->pDeviceHandler->FindDevice(pHMDevice->pszDeviceName, pszDeviceName, namelength) == TRUE) 220 { 221 return (pHMDevice->pDevData); /* OK, we've found our device */ 222 } 230 223 } 231 224 } 232 225 return (NULL); /* haven't found anything, return NULL */ 233 226 } … … 259 252 /* free handle found ? */ 260 253 if (INVALID_HANDLE_VALUE == TabWin32Handles[ulLoop].hmHandleData.hHMHandle) { 261 TabWin32Handles[ulLoop].hmHandleData.dwUserData = 0;262 TabWin32Handles[ulLoop].hmHandleData.dwInternalType = HMTYPE_UNKNOWN;263 TabWin32Handles[ulLoop].hmHandleData.lpDeviceData = NULL;264 handleMutex.leave();254 TabWin32Handles[ulLoop].hmHandleData.dwUserData = 0; 255 TabWin32Handles[ulLoop].hmHandleData.dwInternalType = HMTYPE_UNKNOWN; 256 TabWin32Handles[ulLoop].hmHandleData.lpDeviceData = NULL; 257 handleMutex.leave(); 265 258 return (ulLoop); /* OK, then return it to the caller */ 266 259 } … … 389 382 if (HMGlobals.fIsInitialized != TRUE) 390 383 { 391 HMGlobals.fIsInitialized = TRUE; /* OK, done */392 393 384 handleMutex.enter(); 394 385 // fill handle table … … 403 394 0, 404 395 sizeof(HMGlobals)); 396 397 HMGlobals.fIsInitialized = TRUE; /* OK, done */ 405 398 406 399 /* copy standard handles from OS/2's Open32 Subsystem */ … … 442 435 /* @@@PH we could deallocate the device list here */ 443 436 444 if(HMGlobals.pHMOpen32) 445 446 if(HMGlobals.pHMEvent) 447 448 if(HMGlobals.pHMFile) 449 450 if(HMGlobals.pHMMutex) 451 452 if(HMGlobals.pHMSemaphore) 453 454 if(HMGlobals.pHMFileMapping) 455 456 if(HMGlobals.pHMComm) 457 458 if(HMGlobals.pHMToken) 459 460 if(HMGlobals.pHMThread) 461 462 if(HMGlobals.pHMNamedPipe) 463 464 if(HMGlobals.pHMDisk) 465 437 if(HMGlobals.pHMOpen32) 438 delete HMGlobals.pHMOpen32; 439 if(HMGlobals.pHMEvent) 440 delete HMGlobals.pHMEvent; 441 if(HMGlobals.pHMFile) 442 delete HMGlobals.pHMFile; 443 if(HMGlobals.pHMMutex) 444 delete HMGlobals.pHMMutex; 445 if(HMGlobals.pHMSemaphore) 446 delete HMGlobals.pHMSemaphore; 447 if(HMGlobals.pHMFileMapping) 448 delete HMGlobals.pHMFileMapping; 449 if(HMGlobals.pHMComm) 450 delete HMGlobals.pHMComm; 451 if(HMGlobals.pHMToken) 452 delete HMGlobals.pHMToken; 453 if(HMGlobals.pHMThread) 454 delete HMGlobals.pHMThread; 455 if(HMGlobals.pHMNamedPipe) 456 delete HMGlobals.pHMNamedPipe; 457 if(HMGlobals.pHMDisk) 458 delete HMGlobals.pHMDisk; 466 459 467 460 return (NO_ERROR); … … 1380 1373 if((hFile == GetStdHandle(STD_INPUT_HANDLE)) || 1381 1374 (hFile == GetStdHandle(STD_OUTPUT_HANDLE)) || 1382 (hFile == GetStdHandle(STD_ERROR_HANDLE))) 1375 (hFile == GetStdHandle(STD_ERROR_HANDLE))) 1383 1376 { 1384 1377 return FILE_TYPE_CHAR; -
trunk/src/kernel32/hmcomm.cpp
r4285 r4588 1 /* $Id: hmcomm.cpp,v 1. 5 2000-09-20 21:32:51 hughExp $ */1 /* $Id: hmcomm.cpp,v 1.6 2000-11-14 14:26:59 sandervl Exp $ */ 2 2 3 3 /* … … 14 14 #include <os2win.h> 15 15 #include <string.h> 16 #include "handlemanager.h" 16 #include <handlemanager.h> 17 #include <heapstring.h> 17 18 #include "hmdevice.h" 18 19 #include "hmcomm.h" … … 97 98 } HMDEVCOMDATA, *PHMDEVCOMDATA; 98 99 99 VOID * 100 VOID *CreateDevData() 100 101 { 101 102 PHMDEVCOMDATA pData; … … 126 127 if(pData!= NULL) 127 128 HMDeviceRegisterEx("COM1", this, pData); 128 pData = CreateDevData(); 129 if(pData!= NULL) 130 HMDeviceRegisterEx("COM2", this, pData); 131 pData = CreateDevData(); 132 if(pData!= NULL) 133 HMDeviceRegisterEx("COM3", this, pData); 134 pData = CreateDevData(); 135 if(pData!= NULL) 136 HMDeviceRegisterEx("COM4", this, pData); 137 pData = CreateDevData(); 138 if(pData!= NULL) 139 HMDeviceRegisterEx("COM5", this, pData); 140 pData = CreateDevData(); 141 if(pData!= NULL) 142 HMDeviceRegisterEx("COM6", this, pData); 143 pData = CreateDevData(); 144 if(pData!= NULL) 145 HMDeviceRegisterEx("COM7", this, pData); 146 pData = CreateDevData(); 147 if(pData!= NULL) 148 HMDeviceRegisterEx("COM8", this, pData); 129 } 130 131 /***************************************************************************** 132 * Name : HMDeviceCommClass::FindDevice 133 * Purpose : Checks if lpDeviceName belongs to this device class 134 * Parameters: LPCSTR lpClassDevName 135 * LPCSTR lpDeviceName 136 * int namelength 137 * Variables : 138 * Result : checks if name is COMx or COMx: (x=1..8) 139 * Remark : 140 * Status : 141 * 142 * Author : SvL 143 *****************************************************************************/ 144 BOOL HMDeviceCommClass::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength) 145 { 146 if(namelength > 5) 147 return FALSE; //can't be com name 148 149 //first 3 letters 'COM'? 150 if(lstrncmpiA(lpDeviceName, lpClassDevName, 3) != 0) { 151 return FALSE; 152 } 153 154 if(namelength == 5 && lpDeviceName[4] != ':') { 155 return FALSE; 156 } 157 switch(lpDeviceName[3]) { 158 case '1': 159 case '2': 160 case '3': 161 case '4': 162 case '5': 163 case '6': 164 case '7': 165 case '8': 166 return TRUE; //we support up to COM8 167 } 168 return FALSE; 149 169 } 150 170 … … 154 174 PHMHANDLEDATA pHMHandleDataTemplate) 155 175 { 176 char comname[6]; 177 156 178 dprintf(("HMComm: Serial communication port %s open request\n", lpFileName)); 157 179 180 if(strlen(lpFileName) > 5) { 181 return -1; //safety check (unnecessary..) 182 } 158 183 pHMHandleData->hHMHandle = 0; 184 185 strcpy(comname, lpFileName); 186 comname[4] = 0; //get rid of : (if present) (eg COM1:) 159 187 160 188 //AH: TODO parse Win32 security handles 161 189 OSLibDosDisableHardError(TRUE); 162 pHMHandleData->hHMHandle = OSLibDosOpen( (char*)lpFileName,190 pHMHandleData->hHMHandle = OSLibDosOpen(comname, 163 191 OSLIB_ACCESS_READWRITE | 164 192 OSLIB_ACCESS_SHAREDENYREAD | … … 184 212 &((PHMDEVCOMDATA)pHMHandleData->lpHandlerData)->dcbOS2,ulLen,&ulLen); 185 213 186 if( !rc)214 if(rc) 187 215 { 188 216 return -1; -
trunk/src/kernel32/hmcomm.h
r4285 r4588 1 /* $Id: hmcomm.h,v 1. 5 2000-09-20 21:32:54 hughExp $ */1 /* $Id: hmcomm.h,v 1.6 2000-11-14 14:26:59 sandervl Exp $ */ 2 2 3 3 /* … … 23 23 24 24 HMDeviceCommClass(LPCSTR lpDeviceName); 25 26 //checks if device name belongs to this class 27 virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength); 25 28 26 29 /* this is the handler method for calls to CreateFile() */ -
trunk/src/kernel32/hmdevice.cpp
r4285 r4588 1 /* $Id: hmdevice.cpp,v 1.2 3 2000-09-20 21:32:52 hughExp $ */1 /* $Id: hmdevice.cpp,v 1.24 2000-11-14 14:27:00 sandervl Exp $ */ 2 2 3 3 /* … … 20 20 #include <odin.h> 21 21 #include <os2win.h> 22 #include <string.h> 22 23 #include <misc.h> 23 24 #include "HandleManager.h" … … 70 71 } 71 72 73 74 /***************************************************************************** 75 * Name : HMDeviceHandler::FindDevice 76 * Purpose : Checks if lpDeviceName belongs to this device class 77 * Parameters: LPCSTR lpClassDevName 78 * LPCSTR lpDeviceName 79 * int namelength 80 * Variables : 81 * Result : 82 * Remark : 83 * Status : 84 * 85 * Author : SvL 86 *****************************************************************************/ 87 BOOL HMDeviceHandler::FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength) 88 { 89 if(stricmp(lpClassDevName, lpDeviceName) == 0) { 90 return TRUE; 91 } 92 return FALSE; 93 } 72 94 73 95 /***************************************************************************** -
trunk/src/kernel32/hmdevice.h
r4285 r4588 1 /* $Id: hmdevice.h,v 1.2 3 2000-09-20 21:32:54 hughExp $ */1 /* $Id: hmdevice.h,v 1.24 2000-11-14 14:27:01 sandervl Exp $ */ 2 2 3 3 /* … … 69 69 70 70 HMDeviceHandler(LPCSTR lpDeviceName); /* constructor with device name */ 71 72 //checks if device name belongs to this class 73 virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength); 71 74 72 75 /*********************************** -
trunk/src/kernel32/hmdisk.cpp
r4259 r4588 1 /* $Id: hmdisk.cpp,v 1. 3 2000-09-14 19:08:36sandervl Exp $ */1 /* $Id: hmdisk.cpp,v 1.4 2000-11-14 14:27:02 sandervl Exp $ */ 2 2 3 3 /* … … 21 21 #include <win\aspi.h> 22 22 23 #define DBG_LOCALLOG 23 #define DBG_LOCALLOG DBG_hmdisk 24 24 #include "dbglocal.h" 25 25 26 HMDeviceDiskClass::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 *****************************************************************************/ 44 BOOL 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 } 26 64 //****************************************************************************** 27 65 //TODO: PHYSICALDRIVEn!! … … 46 84 4) == 0) 47 85 { 48 86 lpFileName+=4; 49 87 } 50 88 … … 59 97 if (hFile != INVALID_HANDLE_ERROR) 60 98 { 61 62 63 99 pHMHandleData->hHMHandle = hFile; 100 pHMHandleData->dwUserData = GetDriveTypeA(lpFileName); 101 return (NO_ERROR); 64 102 } 65 103 else { 66 67 104 dprintf(("CreateFile failed; error %d", GetLastError())); 105 return(GetLastError()); 68 106 } 69 107 } … … 81 119 LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped) 82 120 { 83 switch(dwIoControlCode) 121 switch(dwIoControlCode) 84 122 { 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 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: 125 163 { 126 164 HINSTANCE hInstAspi; 127 165 DWORD (WIN32API *GetASPI32SupportInfo)(); 128 166 DWORD (CDECL *SendASPI32Command)(LPSRB lpSRB); 129 167 DWORD numAdapters, rc; … … 131 169 int i, j, k; 132 170 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 if(srb.devtype.SRB_DeviceType == SS_DEVTYPE_CDROM && 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 && 166 204 pHMHandleData->dwUserData == DRIVE_CDROM) 167 168 169 170 171 172 173 205 { 206 goto done; 207 } 208 } 209 } 210 } 211 } 174 212 done: 175 176 177 178 179 180 elseSetLastError(ERROR_FILE_NOT_FOUND); //todo181 182 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; 183 221 failure: 184 185 186 187 } 188 189 190 191 192 193 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; 194 232 195 233 } -
trunk/src/kernel32/hmdisk.h
r4256 r4588 1 /* $Id: hmdisk.h,v 1. 1 2000-09-13 21:10:58sandervl Exp $ */1 /* $Id: hmdisk.h,v 1.2 2000-11-14 14:27:04 sandervl Exp $ */ 2 2 3 3 #ifndef __HMDISK_H__ … … 19 19 { 20 20 public: 21 HMDeviceDiskClass(LPCSTR lpDeviceName) : HMDeviceKernelObjectClass(lpDeviceName) {}; 21 HMDeviceDiskClass(LPCSTR lpDeviceName); 22 23 //checks if device name belongs to this class 24 virtual BOOL FindDevice(LPCSTR lpClassDevName, LPCSTR lpDeviceName, int namelength); 22 25 23 26 /* this is a handler method for calls to CreateFile() */
Note:
See TracChangeset
for help on using the changeset viewer.