Index: trunk/Serial_Server/library/Image.cpp
===================================================================
--- trunk/Serial_Server/library/Image.cpp	(revision 259)
+++ trunk/Serial_Server/library/Image.cpp	(revision 277)
@@ -38,4 +38,10 @@
 
 	return( fi );
+}
+
+void flipEndian( unsigned short *buff, unsigned int len )
+{
+	for( unsigned int t = 0; t < len/2; t++ )
+		buff[t] = (buff[t] & 0xff) << 8 | (buff[t] & 0xff00) >> 8;
 }
 
@@ -178,7 +184,14 @@
 #define ATA_wBpSect 5
 #define ATA_wSPT 6
+
 #define ATA_strSerial 10
+#define ATA_strSerial_Length 20
+
 #define ATA_strFirmware 23
+#define ATA_strFirmware_Length 8
+
 #define ATA_strModel 27
+#define ATA_strModel_Length 40
+
 #define ATA_wCaps 49
 #define ATA_wCurCyls 54
@@ -190,4 +203,5 @@
 // Words carved out of the vendor specific area for our use
 //
+#define ATA_wSerialServerVersion 157
 #define ATA_wSerialFloppyFlagAndType 158
 #define ATA_wSerialPortAndBaud 159
@@ -223,6 +237,8 @@
 };
 
-void Image::respondInquire( unsigned short *buff, struct baudRate *baudRate, unsigned short port, unsigned char scan )
-{
+void Image::respondInquire( unsigned short *buff, unsigned short originalPortAndBaud, struct baudRate *baudRate, unsigned short port, unsigned char scan )
+{
+	char formatBuff[ 128 ];
+
 	memset( &buff[0], 0, 514 );
 
@@ -240,16 +256,19 @@
 
 		if( comPort )
-			sprintf( (char *) &buff[ATA_strModel], "%.15s (COM%c/%s)", shortFileName, comPort, baudRate->display );
+			sprintf( formatBuff, "%.15s (COM%c/%s) ", shortFileName, comPort, baudRate->display );
 		else
-			sprintf( (char *) &buff[ATA_strModel], "%.25s (%s baud)", shortFileName, baudRate->display );
+			sprintf( formatBuff, "%.25s (%s baud) ", shortFileName, baudRate->display );
 	}
 	else
-		sprintf( (char *) &buff[ATA_strModel], "%.30s", shortFileName );
-
-	strncpy( (char *) &buff[ATA_strSerial], "serial", 20 );
-	strncpy( (char *) &buff[ATA_strFirmware], "firmw", 8 );
-
-	for( int t = ATA_strModel; t < ATA_strModel+40; t++ )
-		buff[t] = (buff[t] >> 8) | (buff[t] << 8);
+		sprintf( formatBuff, "%.30s ", shortFileName );
+	strncpy( (char *) &buff[ATA_strModel], formatBuff, ATA_strModel_Length );
+	flipEndian( &buff[ATA_strModel], ATA_strModel_Length );
+
+	strncpy( (char *) &buff[ATA_strSerial], "SerialDrive ", ATA_strSerial_Length );
+	flipEndian( &buff[ATA_strSerial], ATA_strSerial_Length );
+
+	sprintf( formatBuff, "%d.%d ", SERIAL_SERVER_MAJORVERSION, SERIAL_SERVER_MINORVERSION );
+	strncpy( (char *) &buff[ATA_strFirmware], formatBuff, ATA_strFirmware_Length );
+	flipEndian( &buff[ATA_strFirmware], ATA_strFirmware_Length );
 
 	if( useCHS )
@@ -266,6 +285,16 @@
 	}
 
+	// We echo back the port and baud that we were called on from the client, 
+	// the client then uses this value to finalize the DPT.
+	//
+	buff[ ATA_wSerialPortAndBaud ] = originalPortAndBaud;
+
+	// In case the client requires a specific server version...
+	//
+	buff[ ATA_wSerialServerVersion ] = (SERIAL_SERVER_MAJORVERSION << 8) | SERIAL_SERVER_MINORVERSION;
+
 	if( floppy )
-		buff[ ATA_wSerialFloppyFlagAndType ] = ATA_wSerialFloppyFlagAndType_Flag | (floppyType << ATA_wSerialFloppyFlagAndType_TypePosition);
+		buff[ ATA_wSerialFloppyFlagAndType ] = 
+			ATA_wSerialFloppyFlagAndType_Flag | (floppyType << ATA_wSerialFloppyFlagAndType_TypePosition);
 
 	// we always set this, so that the bulk of the BIOS will consider this disk as a hard disk
Index: trunk/Serial_Server/library/Library.h
===================================================================
--- trunk/Serial_Server/library/Library.h	(revision 259)
+++ trunk/Serial_Server/library/Library.h	(revision 277)
@@ -8,4 +8,7 @@
 #ifndef LIBRARY_H_INCLUDED
 #define LIBRARY_H_INCLUDED
+
+#define SERIAL_SERVER_MAJORVERSION 1
+#define SERIAL_SERVER_MINORVERSION 0
 
 void log( int level, char *message, ... );
@@ -54,5 +57,5 @@
 	static int parseGeometry( char *str, unsigned long *p_cyl, unsigned long *p_head, unsigned long *p_sect );
 
-	void respondInquire( unsigned short *buff, struct baudRate *baudRate, unsigned short port, unsigned char scan );
+	void respondInquire( unsigned short *buff, unsigned short originalPortAndBaud, struct baudRate *baudRate, unsigned short port, unsigned char scan );
 
 	void init( char *name, int p_readOnly, int p_drive, unsigned long p_cyl, unsigned long p_head, unsigned long p_sect, int p_useCHS );
Index: trunk/Serial_Server/library/Process.cpp
===================================================================
--- trunk/Serial_Server/library/Process.cpp	(revision 259)
+++ trunk/Serial_Server/library/Process.cpp	(revision 277)
@@ -35,4 +35,11 @@
 		unsigned char baud;
 	} inquire;
+	struct {
+		unsigned char command;
+		unsigned char driveAndHead;
+		unsigned char count;
+		unsigned char scan;
+		unsigned short PackedPortAndBaud;
+	} inquirePacked;
 	unsigned char b[514];
 	unsigned short w[257];
@@ -342,5 +349,6 @@
 					localScan = buff.inquire.scan;         // need to do this before the call to 
 					                                       // img->respondInquire, as it will clear the buff
-					img->respondInquire( &buff.w[0], serial->baudRate, 
+					img->respondInquire( &buff.w[0], buff.inquirePacked.PackedPortAndBaud, 
+										 serial->baudRate, 
 										 ((unsigned short) buff.inquire.port) << 2, 
 										 (img == image1 && lastScan) || buff.inquire.scan );
