- Timestamp:
- Jun 8, 2002, 1:42:04 PM (23 years ago)
- Location:
- trunk/src/wnaspi32
- Files:
-
- 13 added
- 2 deleted
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wnaspi32/initwnaspi32.cpp
r8134 r8601 1 /* $Id: initwnaspi32.cpp,v 1. 6 2002-03-28 16:53:47sandervl Exp $1 /* $Id: initwnaspi32.cpp,v 1.7 2002-06-08 11:42:02 sandervl Exp $ 2 2 * 3 3 * DLL entry point … … 37 37 #include <misc.h> /*PLF Wed 98-03-18 23:18:15*/ 38 38 #include <initdll.h> 39 #include "aspilib.h"40 39 #include <custombuild.h> 40 #include "cdio.h" 41 41 42 42 extern "C" { … … 44 44 extern DWORD wnaspi32_PEResTab; 45 45 } 46 scsiObj *aspi = NULL;47 46 static HMODULE dllHandle = 0; 48 static BOOL fDisableASPI = FALSE;47 BOOL fASPIAvailable = TRUE; 49 48 50 49 //****************************************************************************** … … 53 52 { 54 53 dprintf(("DisableASPI")); 55 f DisableASPI = TRUE;54 fASPIAvailable = FALSE; 56 55 } 57 56 //****************************************************************************** … … 63 62 case DLL_PROCESS_ATTACH: 64 63 { 65 if(f DisableASPI) return TRUE;64 if(fASPIAvailable == FALSE) return TRUE; 66 65 67 aspi = new scsiObj(); 68 if(aspi == NULL) { 66 if(OSLibCdIoInitialize() == FALSE) { 69 67 dprintf(("WNASPI32: LibMain; can't allocate aspi object! APIs will not work!")); 70 68 // @@@AH 20011020 we shouldn't prevent DLL loading in this case … … 72 70 return TRUE; 73 71 } 74 if(aspi->init(65535) == FALSE) 75 { 76 delete aspi; 77 aspi = NULL; 78 dprintf(("WNASPI32: LibMain; can't init aspi object!")); 79 // @@@20011026 and also in this case we shouldn't prevent DLL loading... 80 return TRUE; 81 } 82 dprintf(("WNASPI32: LibMain; aspi object created successfully")); 72 fASPIAvailable = TRUE; 73 dprintf(("WNASPI32: LibMain; os2cdrom.dmd ASPI interface available")); 83 74 return TRUE; 84 75 } … … 89 80 90 81 case DLL_PROCESS_DETACH: 91 if(aspi) { 92 aspi->close(); 93 delete aspi; 94 aspi = NULL; 95 } 82 OSLibCdIoTerminate(); 96 83 return TRUE; 97 84 } -
trunk/src/wnaspi32/makefile
r7063 r8601 1 # $Id: makefile,v 1.1 4 2001-10-15 17:06:19sandervl Exp $1 # $Id: makefile,v 1.15 2002-06-08 11:42:02 sandervl Exp $ 2 2 3 3 # … … 19 19 # 20 20 OBJS = \ 21 $(OBJDIR)\aspilib.obj \22 21 $(OBJDIR)\winaspi32.obj \ 22 $(OBJDIR)\cdio.obj \ 23 23 $(OBJDIR)\wnaspi32rsrc.obj \ 24 24 $(OBJDIR)\initwnaspi32.obj \ … … 32 32 $(ODIN32_LIB)/kernel32.lib \ 33 33 $(ODIN32_LIB)/$(ODINCRT).lib \ 34 $(ODIN32_LIB)/advapi32.lib \35 34 OS2386.LIB \ 36 35 $(RTLLIB_O) -
trunk/src/wnaspi32/winaspi32.cpp
r7143 r8601 1 /* $Id: winaspi32.cpp,v 1.1 3 2001-10-20 09:49:01 achimhaExp $ */1 /* $Id: winaspi32.cpp,v 1.14 2002-06-08 11:42:02 sandervl Exp $ */ 2 2 /* 3 3 * WNASPI routines … … 5 5 * Copyright 1999 Markus Montkowski 6 6 * Copyright 2000 Przemyslaw Dobrowolski 7 * Copyright 2002 Sander van Leeuwen 8 * 9 * Partly based on WINE code (dlls\winaspi\winaspi32.c) 10 * 11 * Copyright 1997 Bruce Milner 12 * Copyright 1998 Andreas Mohr 7 13 * 8 14 * Project Odin Software License can be found in LICENSE.TXT … … 11 17 #include <os2win.h> 12 18 #include <stdlib.h> 19 #include <string.h> 13 20 #include <sys/types.h> 14 21 #include <sys/stat.h> … … 19 26 #include "aspi.h" 20 27 #include "wnaspi32.h" 21 #include <winreg.h>22 28 #include "options.h" 23 29 #include "debugtools.h" 24 25 //#include "srbos2.h" 26 //#include "odinaspi.h" 27 #include "aspilib.h" 28 //#include "callback.h" 30 #include "cdio.h" 29 31 30 32 #ifdef DEBUG … … 32 34 #endif 33 35 34 DEFAULT_DEBUG_CHANNEL(aspi) 35 ODINDEBUGCHANNEL(WNASPI32) 36 37 static void 38 ASPI_DebugPrintCmd(SRB_ExecSCSICmd *prb)36 37 #ifdef DEBUG 38 //***************************************************************************** 39 //***************************************************************************** 40 static void ASPI_DebugPrintCmd(SRB_ExecSCSICmd *prb) 39 41 { 40 42 BYTE cmd; … … 93 95 #endif 94 96 } 95 96 static void 97 ASPI_PrintSenseArea(SRB_ExecSCSICmd *prb)97 //***************************************************************************** 98 //***************************************************************************** 99 static void ASPI_PrintSenseArea(SRB_ExecSCSICmd *prb) 98 100 { 99 101 int i; 100 102 BYTE *cdb; 101 103 102 if (TRACE_ON(aspi))103 {104 104 cdb = &prb->CDBByte[0]; 105 105 DPRINTF("SenseArea["); … … 109 109 } 110 110 DPRINTF("]\n"); 111 } 112 } 113 114 static void 115 ASPI_DebugPrintResult(SRB_ExecSCSICmd *prb) 111 } 112 //***************************************************************************** 113 //***************************************************************************** 114 static void ASPI_DebugPrintResult(SRB_ExecSCSICmd *prb) 116 115 { 117 116 … … 126 125 dprintf(("Result code: %x", prb->SRB_Status)); 127 126 } 128 129 130 static WORD ASPI_ExecScsiCmd( scsiObj *aspi, SRB_ExecSCSICmd *lpPRB) 131 { 132 int status; 133 int error_code = 0; 134 LONG rc; 127 #else 128 #define ASPI_DebugPrintResult(a) 129 #define ASPI_DebugPrintCmd(a) 130 #endif 131 132 //***************************************************************************** 133 // Posting must be done in such a way that as soon as the SRB_Status is set 134 // we don't touch the SRB anymore because it could possibly be freed 135 // if the app is doing ASPI polling 136 //***************************************************************************** 137 static DWORD WNASPI32_DoPosting( SRB_ExecSCSICmd *lpPRB, DWORD status ) 138 { 139 void (* CDECL SRB_PostProc)(SRB_ExecSCSICmd *); 140 BYTE SRB_Flags = lpPRB->SRB_Flags; 141 if( status == SS_PENDING ) 142 { 143 dprintf(("Tried posting SS_PENDING\n")); 144 return SS_PENDING; 145 } 146 *((DWORD *)&SRB_PostProc) = (DWORD)lpPRB->SRB_PostProc; 147 148 lpPRB->SRB_Status = status; 149 /* lpPRB is NOT safe, it could be freed in another thread */ 150 151 if (SRB_PostProc) 152 { 153 if (SRB_Flags & 0x1) 154 { 155 dprintf(("Post Routine (%lx) called\n", (DWORD) SRB_PostProc)); 156 /* Even though lpPRB could have been freed by 157 * the program.. that's unlikely if it planned 158 * to use it in the PostProc 159 */ 160 (*SRB_PostProc)(lpPRB); 161 } 162 else if (SRB_Flags & SRB_EVENT_NOTIFY) { 163 dprintf(("Setting event %04x\n", (HANDLE)SRB_PostProc)); 164 SetEvent((HANDLE)SRB_PostProc); 165 } 166 } 167 return lpPRB->SRB_Status; 168 } 169 //***************************************************************************** 170 //***************************************************************************** 171 static WORD ASPI_ExecScsiCmd(SRB_ExecSCSICmd *lpPRB) 172 { 173 int status; 174 int error_code = 0; 175 LONG rc; 176 CDIO_CMD_BUFFER cdiocmd; 177 178 HCDIO hCDIO = OSLibCdIoGetDevice(lpPRB->SRB_HaId, lpPRB->SRB_Target, lpPRB->SRB_Lun); 179 if(hCDIO == -1) { 180 dprintf(("Failed: invalid device %d %d %d", lpPRB->SRB_HaId, lpPRB->SRB_Target, lpPRB->SRB_Lun)); 181 return WNASPI32_DoPosting( lpPRB, SS_NO_DEVICE ); 182 } 135 183 136 184 /* FIXME: hackmode */ 137 185 #define MAKE_TARGET_TO_HOST(lpPRB) \ 138 186 if (!TARGET_TO_HOST(lpPRB)) { \ 139 WARN("program was not sending target_to_host for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags); \140 lpPRB->SRB_Flags |= 8; \187 dprintf(("program was not sending target_to_host for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags)); \ 188 lpPRB->SRB_Flags |= SRB_DIR_IN; \ 141 189 } 142 190 #define MAKE_HOST_TO_TARGET(lpPRB) \ 143 191 if (!HOST_TO_TARGET(lpPRB)) { \ 144 WARN("program was not sending host_to_target for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags); \145 lpPRB->SRB_Flags |= 0x10; \192 dprintf(("program was not sending host_to_target for cmd %x (flags=%x),correcting.\n",lpPRB->CDBByte[0],lpPRB->SRB_Flags)); \ 193 lpPRB->SRB_Flags |= SRB_DIR_OUT; \ 146 194 } 147 switch (lpPRB->CDBByte[0]) { 148 case 0x12: /* INQUIRY */ 149 case 0x5a: /* MODE_SENSE_10 */ 150 case 0xa4: /* REPORT_KEY (DVD) MMC-2 */ 151 case 0xad: /* READ DVD STRUCTURE MMC-2 */ 152 MAKE_TARGET_TO_HOST(lpPRB) 153 break; 154 case 0xa3: /* SEND KEY (DVD) MMC-2 */ 155 MAKE_HOST_TO_TARGET(lpPRB) 156 break; 157 default: 158 if ((((lpPRB->SRB_Flags & 0x18) == 0x00) || 159 ((lpPRB->SRB_Flags & 0x18) == 0x18) 160 ) && lpPRB->SRB_BufLen 161 ) { 162 FIXME("command 0x%02x, no data transfer specified, but buflen is %ld!!!\n",lpPRB->CDBByte[0],lpPRB->SRB_BufLen); 163 } 164 break; 165 } 166 167 ASPI_DebugPrintCmd(lpPRB); 168 169 lpPRB->SRB_Status = SS_PENDING; 170 171 if (!lpPRB->SRB_CDBLen) 172 { 173 dprintf(("Failed: lpPRB->SRB_CDBLen = 0.")); 174 lpPRB->SRB_Status = SS_ERR; 175 return SS_ERR; 176 } 177 178 if(MaxCDBStatus<lpPRB->SRB_CDBLen) 179 { 180 dprintf(("Failed: lpPRB->SRB_CDBLen > 64.")); 181 lpPRB->SRB_Status = SS_ERR; 182 return SS_ERR; 183 } 184 185 if(lpPRB->SRB_BufLen>65536) // Check Max 64k!! 186 { 187 dprintf(("Failed: lpPRB->SRB_BufLen > 65536.")); 188 lpPRB->SRB_Status = SS_BUFFER_TO_BIG; 189 return SS_BUFFER_TO_BIG; 190 } 191 192 // copy up to LUN SRBOS2 has no WORD for padding like in WINE 193 memcpy( &aspi->SRBlock, 194 lpPRB, 195 6* sizeof(BYTE) + sizeof(DWORD)); 196 aspi->SRBlock.flags |= SRB_Post; 197 aspi->SRBlock.u.cmd.sense_len = lpPRB->SRB_SenseLen;; // length of sense buffer 198 aspi->SRBlock.u.cmd.data_ptr = NULL; // pointer to data buffer 199 aspi->SRBlock.u.cmd.link_ptr = NULL; // pointer to next SRB 200 aspi->SRBlock.u.cmd.data_len = lpPRB->SRB_BufLen; 201 aspi->SRBlock.u.cmd.cdb_len = lpPRB->SRB_CDBLen; // SCSI command length 202 memcpy( &aspi->SRBlock.u.cmd.cdb_st[0], 203 &lpPRB->CDBByte[0], 204 lpPRB->SRB_CDBLen); 205 206 if (HOST_TO_TARGET(lpPRB)) 207 { 208 // Write: Copy all Data to Communication Buffer 209 if (lpPRB->SRB_BufLen) 210 { 211 memcpy( aspi->buffer, 212 lpPRB->SRB_BufPointer, 213 lpPRB->SRB_BufLen); 195 switch (lpPRB->CDBByte[0]) { 196 case 0x12: /* INQUIRY */ 197 case 0x5a: /* MODE_SENSE_10 */ 198 case 0xa4: /* REPORT_KEY (DVD) MMC-2 */ 199 case 0xad: /* READ DVD STRUCTURE MMC-2 */ 200 MAKE_TARGET_TO_HOST(lpPRB) 201 break; 202 case 0xa3: /* SEND KEY (DVD) MMC-2 */ 203 MAKE_HOST_TO_TARGET(lpPRB) 204 break; 205 default: 206 if ((((lpPRB->SRB_Flags & 0x18) == 0x00) || 207 ((lpPRB->SRB_Flags & 0x18) == 0x18) 208 ) && lpPRB->SRB_BufLen 209 ) { 210 dprintf(("command 0x%02x, no data transfer specified, but buflen is %ld!!!\n",lpPRB->CDBByte[0],lpPRB->SRB_BufLen)); 211 } 212 break; 213 } 214 215 ASPI_DebugPrintCmd(lpPRB); 216 217 lpPRB->SRB_Status = SS_PENDING; 218 219 if (!lpPRB->SRB_CDBLen) 220 { 221 dprintf(("Failed: lpPRB->SRB_CDBLen = 0.")); 222 return WNASPI32_DoPosting( lpPRB, SS_INVALID_SRB ); 223 } 224 225 if(MAX_CDBLEN < lpPRB->SRB_CDBLen) 226 { 227 dprintf(("Failed: lpPRB->SRB_CDBLen > 64.")); 228 return WNASPI32_DoPosting( lpPRB, SS_INVALID_SRB ); 229 } 230 231 if(lpPRB->SRB_BufLen > 65536) // Check Max 64k!! 232 { 233 dprintf(("Failed: lpPRB->SRB_BufLen > 65536.")); 234 return WNASPI32_DoPosting( lpPRB, SS_BUFFER_TO_BIG ); 235 } 236 237 memset(&cdiocmd, 0, sizeof(cdiocmd)); 238 239 if(lpPRB->SRB_Flags & SRB_DIR_IN) { 240 cdiocmd.flDirection |= CMDDIR_INPUT; 241 } 242 if(lpPRB->SRB_Flags & SRB_DIR_OUT) { 243 cdiocmd.flDirection |= CMDDIR_OUTPUT; 244 } 245 246 cdiocmd.cbCDB = lpPRB->SRB_CDBLen; 247 memcpy(cdiocmd.arCDB, lpPRB->CDBByte, lpPRB->SRB_CDBLen); 214 248 215 249 #ifdef DEBUG_BUFFER 216 char *cdb = (char *)lpPRB->SRB_BufPointer; 217 dprintfNoEOL(("Write SRB buffer[")); 218 for (int i = 0; i < lpPRB->SRB_BufLen; i++) { 219 if (i != 0) dprintfNoEOL((",0x%02x", *cdb++)); 220 else dprintfNoEOL(("0x%02x", *cdb++)); 221 } 222 dprintfNoEOL(("]\n")); 250 if(lpPRB->SRB_Flags & SRB_DIR_OUT) { 251 char *cdb = (char *)lpPRB->SRB_BufPointer; 252 dprintfNoEOL(("Write SRB buffer[")); 253 for (int i = 0; i < lpPRB->SRB_BufLen; i++) { 254 if (i != 0) dprintfNoEOL((",0x%02x", *cdb++)); 255 else dprintfNoEOL(("0x%02x", *cdb++)); 256 } 257 dprintfNoEOL(("]\n")); 258 } 223 259 #endif 224 } 225 } 226 227 rc = aspi->SendSRBlock(); 228 229 if(!rc) 230 { 231 if( aspi->waitPost()) 232 { 233 if (TARGET_TO_HOST(lpPRB)) 234 { 235 // Was Read : Copy all Data from Communication Buffer 236 if (lpPRB->SRB_BufLen) 237 { 238 memcpy( lpPRB->SRB_BufPointer, 239 aspi->buffer, 240 lpPRB->SRB_BufLen); 260 261 lpPRB->SRB_HaStat = HASTAT_OK; 262 lpPRB->SRB_TargStat = HASTAT_OK; 263 264 if(OSLibCdIoSendCommand(hCDIO, &cdiocmd, lpPRB->SRB_BufPointer, lpPRB->SRB_BufLen) == FALSE) { 265 dprintf(("OSLibCdIoSendCommand failed!!")); 266 return WNASPI32_DoPosting( lpPRB, SS_ERR ); 267 } 268 269 if(lpPRB->SRB_SenseLen) { 270 if(OSLibCdIoRequestSense(hCDIO, SENSE_BUFFER(lpPRB), lpPRB->SRB_SenseLen) == FALSE) { 271 dprintf(("OSLibCdIoRequestSense failed!!")); 272 return WNASPI32_DoPosting( lpPRB, SS_ERR ); 273 } 274 } 241 275 #ifdef DEBUG_BUFFER 242 char *cdb = (char *)lpPRB->SRB_BufPointer; 243 dprintfNoEOL(("Read SRB buffer[")); 244 for (int i = 0; i < lpPRB->SRB_BufLen; i++) { 245 if (i != 0) dprintfNoEOL((",0x%02x", *cdb++)); 246 else dprintfNoEOL(("0x%02x", *cdb++)); 247 } 248 dprintfNoEOL(("]\n")); 276 if(lpPRB->SRB_Flags & SRB_DIR_IN) { 277 char *cdb = (char *)lpPRB->SRB_BufPointer; 278 dprintfNoEOL(("Write SRB buffer[")); 279 for (int i = 0; i < lpPRB->SRB_BufLen; i++) { 280 if (i != 0) dprintfNoEOL((",0x%02x", *cdb++)); 281 else dprintfNoEOL(("0x%02x", *cdb++)); 282 } 283 dprintfNoEOL(("]\n")); 284 } 249 285 #endif 250 } 251 } 252 253 if (lpPRB->SRB_SenseLen) 254 { 255 int sense_len = lpPRB->SRB_SenseLen; 256 if (lpPRB->SRB_SenseLen > 32) 257 sense_len = 32; 258 memcpy( SENSE_BUFFER(lpPRB), 259 &aspi->SRBlock.u.cmd.cdb_st[aspi->SRBlock.u.cmd.cdb_len], 260 sense_len); 261 } 262 263 #if 0 264 /* FIXME: Should this be != 0 maybe? */ 265 if(aspi->SRBlock.u.cmd.target_status == 2 ) { 266 aspi->SRBlock.status = SS_ERR; 267 switch (lpPRB->CDBByte[0]) { 268 case 0xa4: /* REPORT_KEY (DVD) MMC-2 */ 269 case 0xa3: /* SEND KEY (DVD) MMC-2 */ 270 aspi->SRBlock.status = SS_COMP; 271 aspi->SRBlock.u.cmd.target_status = 0; 272 FIXME("Program wants to do DVD Region switching, but fails (non compliant DVD drive). Ignoring....\n"); 273 break; 274 } 275 } 276 #endif 277 /* now do posting */ 278 if (lpPRB->SRB_PostProc) 279 { 280 if(ASPI_POSTING(lpPRB)) 281 { 282 dprintf(("Post Routine (%lx) called\n", (DWORD) lpPRB->SRB_PostProc)); 283 (*lpPRB->SRB_PostProc)(); 284 } 285 else 286 if (lpPRB->SRB_Flags & SRB_EVENT_NOTIFY) 287 { 288 dprintf(("Setting event %04x\n", (HANDLE)lpPRB->SRB_PostProc)); 289 SetEvent((HANDLE)lpPRB->SRB_PostProc); /* FIXME: correct ? */ 290 } 291 } 292 } 293 } 294 else 295 lpPRB->SRB_Status = SS_ERR; 296 297 //SvL: Shouldn't this be set before posting? 298 lpPRB->SRB_Status = aspi->SRBlock.status; 299 lpPRB->SRB_HaStat = aspi->SRBlock.u.cmd.ha_status; 300 lpPRB->SRB_TargStat = aspi->SRBlock.u.cmd.target_status; 301 302 ASPI_DebugPrintResult(lpPRB); 303 304 return lpPRB->SRB_Status; 305 } 306 307 /******************************************************************* 308 * GetASPI32SupportInfo32 [WNASPI32.0] 309 * 310 * Checks if the ASPI subsystem is initialized correctly. 311 * 312 * RETURNS 313 * HIWORD: 0. 314 * HIBYTE of LOWORD: status (SS_COMP or SS_FAILED_INIT) 315 * LOBYTE of LOWORD: # of host adapters. 316 */ 317 ODINFUNCTION0(DWORD, GetASPI32SupportInfo) 318 { 319 LONG rc; 320 BYTE bNumDrv; 321 HKEY hkeyDrvInfo; 322 DWORD dwType; 323 DWORD dwData; 324 DWORD dwSize; 325 ULONG ulParam, ulReturn; 326 BYTE brc; 327 328 bNumDrv = 0; 329 330 // first thing we do is check whether we have a successful ASPI setup 331 if (aspi == NULL) 332 { 333 dprintf(("ASPI was not initialized successfully, return error")); 334 return (SS_FAILED_INIT << 8); 335 } 336 337 if(aspi->access(FALSE)) //'non-blocking' call 338 { 339 bNumDrv = aspi->getNumHosts(); 340 brc = SS_COMP; 341 rc = RegOpenKeyA ( HKEY_LOCAL_MACHINE, 342 "Software\\ODIN\\ASPIROUT", 343 &hkeyDrvInfo); 344 if(ERROR_SUCCESS==rc) 345 { 346 dwData = bNumDrv; 347 RegSetValueExA( hkeyDrvInfo, 348 "NumAdapers", 349 NULL, 350 REG_DWORD, 351 (LPBYTE)&dwData, 352 sizeof(DWORD)); 353 RegCloseKey( hkeyDrvInfo); 354 } 355 aspi->release(); 356 } 357 else 358 { 359 // Driver is used by other process/thread 360 // so try get value form registry 361 362 brc = SS_FAILED_INIT; 363 rc = RegOpenKeyA ( HKEY_LOCAL_MACHINE, 364 "Software\\ODIN\\ASPIROUT", 365 &hkeyDrvInfo); 366 367 if(ERROR_SUCCESS!=rc) 368 return ((SS_FAILED_INIT << 8) | bNumDrv); 369 370 dwSize = sizeof(DWORD); 371 rc = RegQueryValueExA( hkeyDrvInfo, 372 "NumAdapers", 373 NULL, 374 &dwType, 375 (BYTE*)&dwData, 376 &dwSize); 377 378 RegCloseKey( hkeyDrvInfo); 379 380 if( (ERROR_SUCCESS==rc) && 381 (REG_DWORD != dwType) ) 382 { 383 bNumDrv = 0xFF & dwData; 384 brc = SS_COMP; 385 } 386 } 387 388 return ((brc << 8) | bNumDrv); /* FIXME: get # of host adapters installed */ 389 } 390 391 /*********************************************************************** 392 * SendASPI32Command32 (WNASPI32.1) 393 */ 286 ASPI_DebugPrintResult(lpPRB); 287 return WNASPI32_DoPosting( lpPRB, SS_COMP ); 288 } 289 //***************************************************************************** 290 // GetASPI32SupportInfo32 [WNASPI32.0] 291 // 292 // Checks if the ASPI subsystem is initialized correctly. 293 // 294 // RETURNS 295 // HIWORD: 0. 296 // HIBYTE of LOWORD: status (SS_COMP or SS_FAILED_INIT) 297 // LOBYTE of LOWORD: # of host adapters. 298 //***************************************************************************** 299 DWORD CDECL GetASPI32SupportInfo() 300 { 301 BYTE bNumDrv; 302 BYTE brc; 303 304 bNumDrv = 0; 305 306 // first thing we do is check whether we have a successful ASPI setup 307 if(fASPIAvailable == FALSE) 308 { 309 dprintf(("ASPI was not initialized successfully, return error")); 310 return (SS_FAILED_INIT << 8); 311 } 312 313 bNumDrv = OSLibCdIoGetNumDrives(); 314 if (!bNumDrv) 315 return SS_NO_ADAPTERS << 8; 316 317 brc = SS_COMP; 318 319 //pretend there's only one controller 320 return ((brc << 8) | 1); 321 } 322 //***************************************************************************** 323 // SendASPI32Command32 (WNASPI32.1) 324 //***************************************************************************** 394 325 DWORD CDECL SendASPI32Command(LPSRB lpSRB) 395 326 { … … 397 328 ULONG ulParam, ulReturn; 398 329 BYTE bRC; 399 LONG rc;330 LONG rc; 400 331 401 332 // first thing we do is check whether we have a successful ASPI setup 402 if (aspi == NULL)333 if(fASPIAvailable == FALSE) 403 334 { 404 335 dprintf(("SendASPI32Command: ASPI was not initialized successfully, return error")); … … 407 338 408 339 if(NULL==lpSRB) 409 return SS_INVALID_SRB; // Not sure what to return here but that is an error340 return SS_INVALID_SRB; // Not sure what to return here but that is an error 410 341 411 342 dprintf(("SendASPI32Command %x %d", lpSRB, lpSRB->common.SRB_Cmd)); 412 343 413 // test first for a valid command 414 if( (SC_HA_INQUIRY!=lpSRB->common.SRB_Cmd) && 415 (SC_GET_DEV_TYPE!=lpSRB->common.SRB_Cmd) && 416 (SC_EXEC_SCSI_CMD!=lpSRB->common.SRB_Cmd) && 417 (SC_ABORT_SRB!=lpSRB->common.SRB_Cmd) && 418 (SC_RESET_DEV!=lpSRB->common.SRB_Cmd) ) 419 { 420 dprintf(("Invalid command!")); 344 dwRC = SS_ERR; 345 346 switch (lpSRB->common.SRB_Cmd) 347 { 348 case SC_HA_INQUIRY: 349 lpSRB->inquiry.SRB_Status = SS_COMP; /* completed successfully */ 350 lpSRB->inquiry.HA_Count = 1; 351 lpSRB->inquiry.HA_SCSI_ID = 7; /* not always ID 7 */ 352 strcpy((char *)lpSRB->inquiry.HA_ManagerId, "ASPI for WIN32"); /* max 15 chars, don't change */ 353 strcpy((char *)lpSRB->inquiry.HA_Identifier, "Odin host"); /* FIXME: return host adapter name */ 354 memset(lpSRB->inquiry.HA_Unique, 0, 16); /* default HA_Unique content */ 355 lpSRB->inquiry.HA_Unique[6] = 0x02; /* Maximum Transfer Length (128K, Byte> 4-7) */ 356 lpSRB->inquiry.HA_Unique[3] = 0x08; /* Maximum number of SCSI targets */ 357 dprintf(("ASPI: Partially implemented SC_HA_INQUIRY for adapter %d.\n", lpSRB->inquiry.SRB_HaId)); 358 359 //OS/2 override 360 lpSRB->inquiry.HA_Unique[6] = 0x01; // transfer only 64KB 361 lpSRB->inquiry.HA_Unique[3] = 0x10; // 16 devices. 362 363 dwRC = SS_COMP; 364 break; 365 366 case SC_GET_DEV_TYPE: 367 { 368 dprintf(("SC_GET_DEV_TYPE %d %d %d", lpSRB->devtype.SRB_HaId, lpSRB->devtype.SRB_Target, lpSRB->devtype.SRB_Lun)); 369 370 /* FIXME: We should return SS_NO_DEVICE if the device is not configured */ 371 /* FIXME: We should return SS_INVALID_HA if HostAdapter!=0 */ 372 SRB tmpsrb; 373 char inqbuf[200]; 374 DWORD ret; 375 376 memset(&tmpsrb,0,sizeof(tmpsrb)); 377 378 /* Copy header */ 379 memcpy(&tmpsrb.common,&(lpSRB->common),sizeof(tmpsrb.common)); 380 381 tmpsrb.cmd.SRB_Flags |= 8; /* target to host */ 382 tmpsrb.cmd.SRB_Cmd = SC_EXEC_SCSI_CMD; 383 tmpsrb.cmd.SRB_Target = lpSRB->devtype.SRB_Target; 384 tmpsrb.cmd.SRB_Lun = lpSRB->devtype.SRB_Lun; 385 tmpsrb.cmd.SRB_BufLen = sizeof(inqbuf); 386 tmpsrb.cmd.SRB_BufPointer = (BYTE *)inqbuf; 387 tmpsrb.cmd.CDBByte[0] = 0x12; /* INQUIRY */ 388 /* FIXME: handle lun */ 389 tmpsrb.cmd.CDBByte[4] = sizeof(inqbuf); 390 tmpsrb.cmd.SRB_CDBLen = 6; 391 392 ret = ASPI_ExecScsiCmd(&tmpsrb.cmd); 393 394 lpSRB->devtype.SRB_Status = tmpsrb.cmd.SRB_Status; 395 lpSRB->devtype.SRB_DeviceType = inqbuf[0] & 0x1f; 396 397 TRACE("returning devicetype %d for target %d\n", inqbuf[0] & 0x1f, tmpsrb.cmd.SRB_Target); 398 399 if (ret!=SS_PENDING) /* Any error is passed down directly */ 400 return ret; 401 /* FIXME: knows that the command is finished already, pass final Status */ 402 return tmpsrb.cmd.SRB_Status; 403 } 404 405 case SC_EXEC_SCSI_CMD: 406 dwRC = ASPI_ExecScsiCmd(&lpSRB->cmd); 407 break; 408 409 case SC_ABORT_SRB: 410 dprintf(("SC_ABORT_SRB %d", lpSRB->abort.SRB_HaId)); 411 dwRC = SS_INVALID_SRB; // We don't do async ASPI so no way to abort 412 break; 413 414 case SC_RESET_DEV: 415 { 416 HCDIO hCDIO = OSLibCdIoGetDevice(lpSRB->reset.SRB_HaId, lpSRB->reset.SRB_Target, lpSRB->reset.SRB_Lun); 417 if(hCDIO == -1) { 418 return SS_NO_DEVICE; 419 } 420 dprintf(("SC_RESET_DEV %d %d %d", lpSRB->reset.SRB_HaId, lpSRB->reset.SRB_Target, lpSRB->reset.SRB_Lun)); 421 OSLibCdIoResetUnit(hCDIO); 422 dwRC = SS_COMP; 423 break; 424 } 425 426 case SC_GET_DISK_INFO: 427 /* here we have to find out the int13 / bios association. 428 * We just say we do not have any. 429 */ 430 FIXME("SC_GET_DISK_INFO always return 'int13 unassociated disk'.\n"); 431 lpSRB->diskinfo.SRB_DriveFlags = 0; /* disk is not int13 served */ 432 return SS_COMP; 433 434 default: 435 dprintf(("Invalid command!")); 421 436 return SS_INVALID_SRB; // shoud be invalid command 422 } 423 424 dwRC = SS_ERR; 425 426 if(aspi->access(TRUE)) // Block if a SRB is pending 427 { 428 switch (lpSRB->common.SRB_Cmd) 429 { 430 case SC_HA_INQUIRY: 431 aspi->HA_inquiry(lpSRB->inquiry.SRB_HaId); 432 memset(lpSRB,0,sizeof(SRB_HaInquiry)); 433 memcpy( lpSRB, 434 &aspi->SRBlock, 435 sizeof(SRB_HaInquiry)-4 ); 436 // FIXME: I'dont know why in OS/2->ha_unique are filled with 0 437 // Hackmode ON ====== 438 lpSRB->inquiry.HA_Unique[6] = 0x01; // transfer only 64KB 439 lpSRB->inquiry.HA_Unique[3] = 0x10; // 16 devices. 440 // HackMode OFF ===== 441 dwRC = aspi->SRBlock.status; 442 break; 443 444 case SC_GET_DEV_TYPE: 445 rc=aspi->getDeviceType(lpSRB->devtype.SRB_HaId,lpSRB->devtype.SRB_Target, lpSRB->devtype.SRB_Lun); 446 dwRC = lpSRB->devtype.SRB_Status = aspi->SRBlock.status; 447 lpSRB->devtype.SRB_DeviceType = aspi->SRBlock.u.dev.devtype; 448 break; 449 450 case SC_EXEC_SCSI_CMD: 451 dwRC = ASPI_ExecScsiCmd( aspi, &lpSRB->cmd); 452 break; 453 454 case SC_ABORT_SRB: 455 dwRC = SS_INVALID_SRB; // We don't do async ASPI so no way to abort 456 break; 457 458 case SC_RESET_DEV: 459 aspi->resetDevice(lpSRB->reset.SRB_HaId,lpSRB->reset.SRB_Target, lpSRB->reset.SRB_Lun); 460 lpSRB->reset.SRB_Status = aspi->SRBlock.status; 461 lpSRB->reset.SRB_Flags = aspi->SRBlock.flags; 462 lpSRB->reset.SRB_Hdr_Rsvd = 0; 463 memset( lpSRB->reset.SRB_Rsvd1, 464 0, 465 12 ); 466 lpSRB->reset.SRB_HaStat = aspi->SRBlock.u.res.ha_status; /* Host Adapter Status */ 467 lpSRB->reset.SRB_TargStat = aspi->SRBlock.u.res.target_status; /* Target Status */ 468 lpSRB->reset.SRB_PostProc = NULL; /* Post routine */ 469 lpSRB->reset.SRB_Rsvd2 = NULL; /* Reserved */ 470 memset( lpSRB->reset.SRB_Rsvd3, 471 0, 472 32); /* Reserved */ 473 dwRC = aspi->SRBlock.status; 474 break; 475 476 } // end switch (lpSRB->common.SRB_Cmd) 477 478 aspi->release(); 479 } 480 else 481 { 482 dprintf(("Unable to access aspi!!")); 483 dwRC = SS_NO_ASPI; 484 } 485 437 438 } // end switch (lpSRB->common.SRB_Cmd) 439 440 dprintf(("SendASPI32Command %x %d done", lpSRB, lpSRB->common.SRB_Cmd)); 486 441 return dwRC; 487 442 } 488 489 /*********************************************************************** 490 * GetASPI32DLLVersion32 (WNASPI32.3) 491 */ 492 DWORD WINAPI GetASPI32DLLVersion() 493 { 494 return (DWORD)1; 495 } 496 443 //***************************************************************************** 444 // GetASPI32DLLVersion32 (WNASPI32.3) 445 //***************************************************************************** 446 DWORD CDECL GetASPI32DLLVersion() 447 { 448 return (DWORD)1; 449 } 450 //***************************************************************************** 451 //***************************************************************************** 452 453 -
trunk/src/wnaspi32/wnaspi32.def
r4809 r8601 8 8 9 9 EXPORTS 10 GetASPI32SupportInfo = _GetASPI32SupportInfo @0 @110 GetASPI32SupportInfo = _GetASPI32SupportInfo @1 ; CDECL 11 11 SendASPI32Command = _SendASPI32Command @2 ; CDECL 12 GetASPI32DLLVersion = _GetASPI32DLLVersion @0 @312 GetASPI32DLLVersion = _GetASPI32DLLVersion @3 ; CDECL 13 13 ; OrdinalOnlyExport 14 14
Note:
See TracChangeset
for help on using the changeset viewer.