Skip to content
Snippets Groups Projects
Commit 4d47ec26 authored by Andreas Mohr's avatar Andreas Mohr Committed by Alexandre Julliard
Browse files

Added newer (ASPI 3.0 ?) function stubs to WNASPI32.

Better error messages.
parent 2c268318
No related branches found
No related tags found
No related merge requests found
/**************************************************************************
ASPI routines
(C) 2000 David Elliott <dfe@netnitco.net>
(C) 2000 David Elliott <dfe@infinite-internet.net>
Licensed under the WINE (X11) license
*/
......@@ -28,6 +28,7 @@ HKEY_DYN_DATA
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
......@@ -71,7 +72,7 @@ ASPI_GetNumControllers()
if( RegOpenKeyExA(HKEY_DYN_DATA, KEYNAME_SCSI, 0, KEY_ALL_ACCESS, &hkeyScsi ) != ERROR_SUCCESS )
{
ERR("Could not open HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not open HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
return 0;
}
......@@ -84,7 +85,7 @@ ASPI_GetNumControllers()
}
if( RegQueryValueExA(hkeyControllerMap, NULL, NULL, &type, (LPBYTE)&num_ha, &cbData ) != ERROR_SUCCESS )
{
ERR("Could not query value HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not query value HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
num_ha=0;
}
RegCloseKey(hkeyControllerMap);
......@@ -103,7 +104,7 @@ SCSI_GetDeviceName( int h, int c, int t, int d, LPSTR devstr, LPDWORD lpcbData )
if( RegOpenKeyExA(HKEY_DYN_DATA, KEYNAME_SCSI, 0, KEY_ALL_ACCESS, &hkeyScsi ) != ERROR_SUCCESS )
{
ERR("Could not open HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not open HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
return FALSE;
}
......@@ -145,7 +146,7 @@ ASPI_GetHCforController( int controller )
#endif
if( (error=RegCreateKeyExA(HKEY_DYN_DATA, KEYNAME_SCSI, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkeyScsi, &disposition )) != ERROR_SUCCESS )
{
ERR("Could not open HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not open HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
SetLastError(error);
return hc;
}
......@@ -183,6 +184,7 @@ SCSI_OpenDevice( int h, int c, int t, int d )
char devstr[20];
DWORD cbData = 20;
int fd = -1;
char dainbread_linux_hack = 1;
if(!SCSI_GetDeviceName( h, c, t, d, devstr, &cbData ))
{
......@@ -190,14 +192,33 @@ SCSI_OpenDevice( int h, int c, int t, int d )
return -1;
}
linux_hack:
TRACE("Opening device %s mode O_RDWR\n",devstr);
fd = open(devstr, O_RDWR);
if( fd < 0 )
{
TRACE("open failed\n");
int len = strlen(devstr);
FILE_SetDosError(); /* SetLastError() to errno */
TRACE("GetLastError: %ld\n", GetLastError());
TRACE("Open failed (%s)\n", strerror(errno));
/* in case of "/dev/sgX", convert from sga to sg0
* and the other way around.
* FIXME: remove it if the distributions
* finally manage to agree on something.
* The best would probably be a complete
* rewrite of the Linux SCSI layer
* to use CAM + devfs :-) */
if ( (dainbread_linux_hack) &&
(len >= 3) &&
(devstr[len-3] == 's') && (devstr[len-2] == 'g') )
{
char *p = &devstr[len-1];
*p = (*p >= 'a') ? *p - 'a' + '0' : *p - '0' + 'a';
dainbread_linux_hack = 0;
TRACE("Retry with \"equivalent\" Linux device '%s'\n", devstr);
goto linux_hack;
}
}
return fd;
}
......@@ -227,7 +248,7 @@ SCSI_LinuxSetTimeout( int fd, int timeout )
retval=ioctl(fd,SG_SET_TIMEOUT,&timeout);
if(retval)
{
WARN("Could not set timeout errno=%d!\n",errno);
WARN("Could not set timeout ! (%s)\n", strerror(errno));
}
return retval;
......@@ -249,7 +270,7 @@ SCSI_LinuxDeviceIo( int fd,
DWORD dwBytes;
DWORD save_error;
TRACE("Writing to Liunx sg device\n");
TRACE("Writing to Linux sg device\n");
dwBytes = write( fd, lpInBuffer, cbInBuffer );
if( dwBytes != cbInBuffer )
{
......@@ -257,7 +278,7 @@ SCSI_LinuxDeviceIo( int fd,
save_error = GetLastError();
WARN("Not enough bytes written to scsi device. bytes=%ld .. %ld\n", cbInBuffer, dwBytes );
if( save_error == ERROR_NOT_ENOUGH_MEMORY )
MESSAGE("Your Linux kernel was not able to handle the amount of data sent to the scsi device. Try recompiling with a larger SG_BIG_BUFF value (kernel 2.0.x sg.h");
MESSAGE("Your Linux kernel was not able to handle the amount of data sent to the scsi device. Try recompiling with a larger SG_BIG_BUFF value (kernel 2.0.x sg.h)");
WARN("error= %ld\n", save_error );
*lpcbBytesReturned = 0;
return FALSE;
......@@ -381,7 +402,7 @@ SCSI_MapHCtoController()
if( RegCreateKeyExA(HKEY_DYN_DATA, KEYNAME_SCSI, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkeyScsi, &disposition ) != ERROR_SUCCESS )
{
ERR("Could not open HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not open HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
return;
}
if( disposition != REG_OPENED_EXISTING_KEY )
......@@ -425,7 +446,7 @@ SCSI_MapHCtoController()
/* Set (default) value to number of controllers */
if( RegSetValueExA(hkeyControllerMap, NULL, 0, REG_DWORD, (LPBYTE)&num_controller, sizeof(DWORD) ) != ERROR_SUCCESS )
{
ERR("Could not set value HEKY_DYN_DATA\\%s\\%s\n",KEYNAME_SCSI, KEYNAME_SCSI_CONTROLLERMAP);
ERR("Could not set value HKEY_DYN_DATA\\%s\\%s\n",KEYNAME_SCSI, KEYNAME_SCSI_CONTROLLERMAP);
}
RegCloseKey(hkeyControllerMap);
RegCloseKey(hkeyScsi);
......@@ -433,6 +454,27 @@ SCSI_MapHCtoController()
}
#endif
int SCSI_Linux_CheckDevices(void)
{
DIR *devdir;
struct dirent *dent = NULL;
devdir = opendir("/dev");
for (dent=readdir(devdir);dent;dent=readdir(devdir))
{
if (!(strncmp(dent->d_name, "sg", 2)))
break;
}
closedir(devdir);
if (dent == NULL)
{
MESSAGE("WARNING: You don't have any /dev/sgX generic scsi devices ! \"man MAKEDEV\" !\n");
return 0;
}
return 1;
}
static void
SCSI_GetProcinfo()
/* I'll admit, this function is somewhat of a mess... it was originally
......@@ -441,8 +483,10 @@ SCSI_GetProcinfo()
*/
{
#ifdef linux
static const char procname[] = "/proc/scsi/scsi";
FILE * procfile = NULL;
char read_line[40], read1[10] = "\0", read2[10] = "\0";
int result = 0;
struct LinuxProcScsiDevice dev;
......@@ -456,23 +500,35 @@ SCSI_GetProcinfo()
HKEY hkeyScsi;
DWORD disposition;
procfile = fopen( "/proc/scsi/scsi", "r" );
/* Check whether user has generic scsi devices at all */
if (!(SCSI_Linux_CheckDevices()))
return;
procfile = fopen( procname, "r" );
if( !procfile )
{
ERR("Could not open /proc/scsi/scsi\n");
ERR("Could not open %s\n", procname);
return;
}
fgets(read_line, 40, procfile);
sscanf( read_line, "Attached %9s %9s", read1, read2);
if(strcmp(read1, "devices:"))
{
ERR("Incorrect %s format\n", procname);
return;
}
result = fscanf( procfile, "Attached devices: \n");
if( result != 0 )
if(!(strcmp(read2, "none")))
{
ERR("Incorrect /proc/scsi/scsi format");
ERR("No devices found in %s. Make sure you loaded your SCSI driver or set up ide-scsi emulation for your IDE device if this app needs it !\n", procname);
return;
}
if( RegCreateKeyExA(HKEY_DYN_DATA, KEYNAME_SCSI, 0, NULL, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, NULL, &hkeyScsi, &disposition ) != ERROR_SUCCESS )
{
ERR("Could not create HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not create HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
return;
}
......@@ -485,7 +541,7 @@ SCSI_GetProcinfo()
sprintf(devstr, "/dev/sg%c", 'a'+devnum);
if( RegSetValueExA(hkeyScsi, idstr, 0, REG_SZ, devstr, strlen(devstr)+1 ) != ERROR_SUCCESS )
{
ERR("Could not set value HEKY_DYN_DATA\\%s\\%s\n",KEYNAME_SCSI, idstr);
ERR("Could not set value HKEY_DYN_DATA\\%s\\%s\n",KEYNAME_SCSI, idstr);
}
/* Debug output */
......@@ -499,12 +555,12 @@ SCSI_GetProcinfo()
} /* while(1) */
if( result != EOF )
{
ERR("Incorrect /proc/scsi/scsi format");
ERR("Sorry, incorrect %s format\n", procname);
}
fclose( procfile );
if( RegSetValueExA(hkeyScsi, NULL, 0, REG_DWORD, (LPBYTE)&num_ha, sizeof(num_ha) ) != ERROR_SUCCESS )
{
ERR("Could not set value HEKY_DYN_DATA\\%s\n",KEYNAME_SCSI);
ERR("Could not set value HKEY_DYN_DATA\\%s\n",KEYNAME_SCSI);
}
RegCloseKey(hkeyScsi);
return;
......
......@@ -192,12 +192,12 @@ ASPI_PrintSenseArea(SRB_ExecSCSICmd *prb)
{
DPRINTF("Request Sense reports:\n");
if ((rqbuf[0]&0x7f)!=0x70) {
DPRINTF("\tInvalid sense header.\n");
DPRINTF("\tInvalid sense header: 0x%02x instead of 0x70\n", rqbuf[0]&0x7f);
return;
}
DPRINTF("\tCurrent command read filemark: %s\n",(rqbuf[2]&0x80)?"yes":"no");
DPRINTF("\tEarly warning passed: %s\n",(rqbuf[2]&0x40)?"yes":"no");
DPRINTF("\tIncorrect blocklengt: %s\n",(rqbuf[2]&0x20)?"yes":"no");
DPRINTF("\tIncorrect blocklength: %s\n",(rqbuf[2]&0x20)?"yes":"no");
DPRINTF("\tSense Key: %d\n",rqbuf[2]&0xf);
if (rqbuf[0]&0x80)
DPRINTF("\tResidual Length: %d\n",rqbuf[3]*0x1000000+rqbuf[4]*0x10000+rqbuf[5]*0x100+rqbuf[6]);
......@@ -315,8 +315,6 @@ ASPI_ExecScsiCmd(SRB_ExecSCSICmd *lpPRB)
ASPI_DebugPrintCmd(lpPRB);
fd = ASPI_OpenDevice(lpPRB);
if (fd == -1) {
TRACE("Failed: could not open device c%01dt%01dd%01d. Device permissions !?\n",
lpPRB->SRB_HaId,lpPRB->SRB_Target,lpPRB->SRB_Lun);
return WNASPI32_DoPosting( lpPRB, SS_NO_DEVICE );
}
......@@ -550,3 +548,20 @@ DWORD WINAPI GetASPI32DLLVersion()
#endif
}
BOOL __cdecl GetASPI32Buffer(/*PASPI32BUFF*/LPVOID pab)
{
FIXME("(%p), stub !\n", pab);
return TRUE;
}
BOOL __cdecl FreeASPI32Buffer(/*PASPI32BUFF*/LPVOID pab)
{
FIXME("(%p), stub !\n", pab);
return TRUE;
}
BOOL __cdecl TranslateASPI32Address(LPDWORD pdwPath, LPDWORD pdwDEVNODE)
{
FIXME("(%p, %p), stub !\n", pdwPath, pdwDEVNODE);
return TRUE;
}
......@@ -4,7 +4,16 @@ init WNASPI32_LibMain
import kernel32.dll
1 stdcall GetASPI32SupportInfo() GetASPI32SupportInfo
# we have several ordinal clashes here, it seems...
1 cdecl GetASPI32SupportInfo() GetASPI32SupportInfo
2 cdecl SendASPI32Command(ptr) SendASPI32Command
4 stdcall GetASPI32DLLVersion() GetASPI32DLLVersion
7 stub OrdinalOnlyExport
4 cdecl GetASPI32DLLVersion() GetASPI32DLLVersion
# 5 is the ordinal used by Adaptec's WNASPI32 DLL
#5 cdecl GetASPI32DLLVersion() GetASPI32DLLVersion
6 stub RegisterWOWPost
7 cdecl TranslateASPI32Address(ptr ptr) TranslateASPI32Address
8 cdecl GetASPI32Buffer(ptr) GetASPI32Buffer
# FreeASPI32Buffer: ord clash with GetASPI32DLLVersion (4), so use 14 instead
14 cdecl FreeASPI32Buffer(ptr) FreeASPI32Buffer
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment