dlls/ntdll/cdrom.c improve GetIdeInterface/SCSI support

Yorick Hardy yh at metroweb.co.za
Sat May 24 08:20:08 CDT 2003


Improve CDROM_GetIdeInterface (becomes CDROM_GetInterfaceInfo), in order
to better support SCSI drives.

(Please examine carefully, since I probably don't know what I am doing ;-) )

-- 
Yorick Hardy

--- dlls/ntdll/cdrom.c	Sat May 24 09:24:37 2003
+++ dlls/ntdll/cdrom.c	Sat May 24 14:20:54 2003
@@ -342,15 +342,16 @@
 
 
 /******************************************************************
- *		CDROM_GetIdeInterface
+ *		CDROM_GetInterfaceInfo
  *
  * Determines the ide interface (the number after the ide), and the
- * number of the device on that interface for ide cdroms.
+ * number of the device on that interface for ide cdroms (*port == 0).
+ * Determines the scsi information for scsi cdroms (*port == 1).
  * Returns false if the info could not be get
  *
  * NOTE: this function is used in CDROM_InitRegistry and CDROM_GetAddress
  */
-static int CDROM_GetIdeInterface(int fd, int* iface, int* device)
+static int CDROM_GetInterfaceInfo(int fd, int* port, int* iface, int* device,int* lun)
 {
 #if defined(linux)
     {
@@ -365,6 +366,8 @@
             FIXME("cdrom not a block device!!!\n");
             return 0;
         }
+        *port = 0;
+        *lun = 0;
         switch (major(st.st_rdev)) {
             case IDE0_MAJOR: *iface = 0; break;
             case IDE1_MAJOR: *iface = 1; break;
@@ -387,12 +390,15 @@
        struct scsi_addr addr;
        if (ioctl(fd, SCIOCIDENTIFY, &addr) != -1) {
             switch (addr.type) {
-                /* for SCSI copy linux case, i.e. start at *iface = 11 */
-                case TYPE_SCSI:  *iface = 11 + addr.addr.scsi.scbus;
+                case TYPE_SCSI:  *port = 1;
+                                 *iface = addr.addr.scsi.scbus;
                                  *device = addr.addr.scsi.target;
+                                 *lun = addr.addr.scsi.lun;
                                  break;
-                case TYPE_ATAPI: *iface = addr.addr.atapi.atbus;
+                case TYPE_ATAPI: *port = 0;
+                                 *iface = addr.addr.atapi.atbus;
                                  *device = addr.addr.atapi.drive;
+                                 *lun = 0;
                                  break;
             }
             return 1;
@@ -420,7 +426,7 @@
  */
 void CDROM_InitRegistry(int fd)
 {
-    int portnum, targetid;
+    int portnum, busid, targetid, lun;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING nameW;
     WCHAR dataW[50];
@@ -441,7 +447,7 @@
     attr.SecurityDescriptor = NULL;
     attr.SecurityQualityOfService = NULL;
 
-    if ( ! CDROM_GetIdeInterface(fd, &portnum, &targetid))
+    if ( ! CDROM_GetInterfaceInfo(fd, &portnum, &busid, &targetid, &lun))
         return;
 
     /* Ensure there is Scsi key */
@@ -488,8 +494,9 @@
     NtSetValueKey( portKey,&nameW, 0, REG_DWORD, (BYTE *)&value, sizeof(DWORD));
     RtlFreeUnicodeString( &nameW );
 
+    snprintf(buffer,40,"Scsi Bus %d", busid);
     attr.RootDirectory = portKey;
-    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, "Scsi Bus 0" ) ||
+    if (!RtlCreateUnicodeStringFromAsciiz( &nameW, buffer ) ||
         NtCreateKey( &busKey, KEY_ALL_ACCESS, &attr, 0,
                      NULL, REG_OPTION_VOLATILE, &disp ))
     {
@@ -1621,16 +1628,17 @@
  */
 static DWORD CDROM_GetAddress(int dev, SCSI_ADDRESS* address)
 {
-    int portnum, targetid;
+    int portnum, busid, targetid, lun;
 
     address->Length = sizeof(SCSI_ADDRESS);
-    address->PathId = 0; /* bus number */
-    address->Lun = 0;
-    if ( ! CDROM_GetIdeInterface(cdrom_cache[dev].fd, &portnum, &targetid))
+    if ( ! CDROM_GetInterfaceInfo(cdrom_cache[dev].fd, &portnum,
+                                  &busid, &targetid, &lun))
         return STATUS_NOT_SUPPORTED;
 
     address->PortNumber = portnum;
+    address->PathId = busid; /* bus number */
     address->TargetId = targetid;
+    address->Lun = lun;
     return STATUS_SUCCESS;
 }
 



More information about the wine-patches mailing list