mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
9.5 KiB
328 lines
9.5 KiB
/*****************************************************************************
|
|
*
|
|
* COPYRIGHT 1993 - COLORADO MEMORY SYSTEMS, INC.
|
|
* ALL RIGHTS RESERVED.
|
|
*
|
|
******************************************************************************
|
|
*
|
|
* FILE: \SE\DRIVER\Q117KDI\NT\SRC\0X15A1C.C
|
|
*
|
|
* FUNCTION: kdi_UpdateRegistryInfo
|
|
*
|
|
* PURPOSE:
|
|
*
|
|
* HISTORY:
|
|
* $Log: J:\se.vcs\driver\q117kdi\nt\src\0x15a1c.c $
|
|
*
|
|
* Rev 1.4 26 Apr 1994 16:31:26 KEVINKES
|
|
* Updated strings to support new drive classes.
|
|
*
|
|
* Rev 1.3 17 Feb 1994 11:52:24 KEVINKES
|
|
* Modified to update registry with FDC info and Xfer rates.
|
|
*
|
|
* Rev 1.2 19 Jan 1994 11:38:36 KEVINKES
|
|
* Fixed debug code.
|
|
*
|
|
* Rev 1.1 18 Jan 1994 16:30:48 KEVINKES
|
|
* Fixed compile errors and added debug changes.
|
|
*
|
|
* Rev 1.0 03 Dec 1993 13:46:28 KEVINKES
|
|
* Initial Revision.
|
|
*
|
|
*****************************************************************************/
|
|
#define FCT_ID 0x15A1C
|
|
#include "include\public\adi_api.h"
|
|
#include "include\public\frb_api.h"
|
|
#include "include\public\vendor.h"
|
|
#include "q117kdi\include\kdiwhio.h"
|
|
#include "q117kdi\include\kdiwpriv.h"
|
|
#include "include\private\kdi_pub.h"
|
|
/*endinclude*/
|
|
|
|
NTSTATUS kdi_WriteRegString(
|
|
HANDLE unit_key,
|
|
PSTR name,
|
|
PSTR value
|
|
)
|
|
{
|
|
UNICODE_STRING usValue;
|
|
UNICODE_STRING usName;
|
|
STRING sTemp;
|
|
NTSTATUS nt_status;
|
|
|
|
RtlInitString(&sTemp,name);
|
|
|
|
nt_status = RtlAnsiStringToUnicodeString(
|
|
&usName,
|
|
&sTemp,
|
|
TRUE );
|
|
|
|
if ( NT_SUCCESS( nt_status ) ) {
|
|
RtlInitString(&sTemp,value);
|
|
|
|
//
|
|
// Include the NULL character at the end of the string in the
|
|
// unicode string.
|
|
//
|
|
|
|
sTemp.Length++;
|
|
|
|
nt_status = RtlAnsiStringToUnicodeString(
|
|
&usValue,
|
|
&sTemp,
|
|
TRUE );
|
|
|
|
if ( NT_SUCCESS( nt_status ) ) {
|
|
|
|
nt_status = ZwSetValueKey(
|
|
unit_key,
|
|
&usName,
|
|
0,
|
|
REG_SZ,
|
|
usValue.Buffer,
|
|
usValue.Length
|
|
);
|
|
|
|
RtlFreeUnicodeString(&usValue);
|
|
|
|
}
|
|
|
|
RtlFreeUnicodeString(&usName);
|
|
|
|
}
|
|
|
|
return nt_status;
|
|
}
|
|
dVoid kdi_UpdateRegistryInfo
|
|
(
|
|
/* INPUT PARAMETERS: */
|
|
|
|
dVoidPtr kdi_context,
|
|
dVoidPtr device_descriptor,
|
|
dVoidPtr device_cfg
|
|
|
|
/* UPDATE PARAMETERS: */
|
|
|
|
/* OUTPUT PARAMETERS: */
|
|
|
|
)
|
|
/* COMMENTS: *****************************************************************
|
|
*
|
|
* Routine Description:
|
|
*
|
|
* This function updates the devicemap.
|
|
*
|
|
* DEFINITIONS: *************************************************************/
|
|
{
|
|
|
|
/* DATA: ********************************************************************/
|
|
|
|
HANDLE unit_key;
|
|
UNICODE_STRING nt_unicode_string;
|
|
UNICODE_STRING name;
|
|
OBJECT_ATTRIBUTES object_attributes;
|
|
CHAR buffer[100];
|
|
NTSTATUS nt_status;
|
|
PSTR pstr;
|
|
STRING ntNameString;
|
|
|
|
/* CODE: ********************************************************************/
|
|
|
|
/* Create the Tape key in the device map. */
|
|
|
|
sprintf(buffer,"\\Registry\\Machine\\Hardware\\DeviceMap\\Tape\\Unit %d",
|
|
((KdiContextPtr)kdi_context)->tape_number);
|
|
|
|
RtlInitString(&ntNameString,buffer);
|
|
|
|
nt_status = RtlAnsiStringToUnicodeString(
|
|
&name,
|
|
&ntNameString,
|
|
TRUE );
|
|
|
|
if (!NT_SUCCESS(nt_status)) {
|
|
return;
|
|
}
|
|
|
|
/* Initialize the object for the key. */
|
|
|
|
InitializeObjectAttributes( &object_attributes,
|
|
&name,
|
|
OBJ_CASE_INSENSITIVE,
|
|
dNULL_PTR,
|
|
(PSECURITY_DESCRIPTOR) dNULL_PTR );
|
|
|
|
|
|
/* Create the key or open it. */
|
|
|
|
nt_status = ZwOpenKey(&unit_key,
|
|
KEY_READ | KEY_WRITE,
|
|
&object_attributes );
|
|
|
|
RtlFreeUnicodeString(&name);
|
|
|
|
if (!NT_SUCCESS(nt_status)) {
|
|
return;
|
|
}
|
|
|
|
kdi_CheckedDump(
|
|
QIC117INFO,
|
|
"Q117i: Tape Device Number %08x\n",
|
|
((KdiContextPtr)kdi_context)->tape_number);
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->vendor) {
|
|
|
|
case VENDOR_CMS:
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->model) {
|
|
case MODEL_CMS_QIC40: pstr = "Colorado Jumbo 120 from Hewlett-Packard"; break;
|
|
case MODEL_CMS_QIC80_STINGRAY:
|
|
case MODEL_CMS_QIC80: pstr = "Colorado Jumbo 250 from Hewlett-Packard"; break;
|
|
case MODEL_CMS_QIC3010: pstr = "Colorado 700 from Hewlett-Packard"; break;
|
|
case MODEL_CMS_QIC3020: pstr = "Colorado 1400 from Hewlett-Packard"; break;
|
|
case MODEL_CMS_QIC80W: pstr = "Colorado T1000 from Hewlett-Packard"; break;
|
|
case MODEL_CMS_TR3: pstr = "Colorado T3000 from Hewlett-Packard"; break;
|
|
default: pstr = "Colorado floppy tape drive from Hewlett-Packard";
|
|
}
|
|
|
|
break;
|
|
|
|
case VENDOR_MOUNTAIN_SUMMIT:
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->drive_class) {
|
|
|
|
case QIC40_DRIVE: pstr = "Summit QIC-40 floppy tape drive"; break;
|
|
case QIC80_DRIVE: pstr = "Summit QIC-80 floppy tape drive"; break;
|
|
case QIC3010_DRIVE: pstr = "Summit QIC-3010 floppy tape drive"; break;
|
|
case QIC3020_DRIVE: pstr = "Summit QIC-3020 floppy tape drive"; break;
|
|
default: pstr = "Summit floppy tape drive";
|
|
}
|
|
|
|
break;
|
|
|
|
case VENDOR_WANGTEK_REXON:
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->drive_class) {
|
|
|
|
case QIC40_DRIVE: pstr = "Wangtek QIC-40 floppy tape drive"; break;
|
|
case QIC80_DRIVE: pstr = "Wangtek QIC-80 floppy tape drive"; break;
|
|
case QIC3010_DRIVE: pstr = "Wangtek QIC-3010 floppy tape drive"; break;
|
|
case QIC3020_DRIVE: pstr = "Wangtek QIC-3020 floppy tape drive"; break;
|
|
default: pstr = "Wangtek floppy tape drive";
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case VENDOR_CORE:
|
|
|
|
if (((DeviceDescriptorPtr)device_descriptor)->drive_class == QIC80_DRIVE) {
|
|
pstr = "Core QIC-80 floppy tape drive";
|
|
} else {
|
|
pstr = "Core QIC-40 floppy tape drive";
|
|
}
|
|
|
|
break;
|
|
|
|
case VENDOR_EXABYTE:
|
|
|
|
if (((DeviceDescriptorPtr)device_descriptor)->drive_class == QIC3020_DRIVE) {
|
|
pstr = "Exabyte QIC-3020 floppy tape drive";
|
|
} else {
|
|
pstr = "Exabyte floppy tape drive";
|
|
}
|
|
|
|
break;
|
|
|
|
case VENDOR_IOMEGA:
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->drive_class) {
|
|
|
|
case QIC40_DRIVE: pstr = "Iomega QIC-40 floppy tape drive"; break;
|
|
case QIC80_DRIVE: pstr = "Iomega QIC-80 floppy tape drive"; break;
|
|
case QIC3010_DRIVE: pstr = "Iomega QIC-3010 floppy tape drive"; break;
|
|
case QIC3020_DRIVE: pstr = "Iomega QIC-3020 floppy tape drive"; break;
|
|
default: pstr = "Iomega floppy tape drive";
|
|
}
|
|
break;
|
|
|
|
case VENDOR_CMS_ENHANCEMENTS:
|
|
|
|
if (((DeviceDescriptorPtr)device_descriptor)->drive_class == QIC80_DRIVE) {
|
|
pstr = "CMS Enhancements QIC-80 floppy tape drive";
|
|
|
|
} else {
|
|
pstr = "CMS Enhancements QIC-40 floppy tape drive";
|
|
|
|
}
|
|
break;
|
|
|
|
case VENDOR_ARCHIVE_CONNER:
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->drive_class) {
|
|
|
|
case QIC40_DRIVE: pstr = "Conner QIC-40 floppy tape drive"; break;
|
|
case QIC80_DRIVE: pstr = "Conner QIC-80 floppy tape drive"; break;
|
|
case QIC3010_DRIVE: pstr = "Conner QIC-3010 floppy tape drive"; break;
|
|
case QIC3020_DRIVE: pstr = "Conner QIC-3020 floppy tape drive"; break;
|
|
default: pstr = "Conner floppy tape drive";
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
|
|
pstr = "QIC-40/QIC-80/QIC3010/QIC3020 floppy tape drive";
|
|
}
|
|
|
|
/* Add Identifier value. */
|
|
|
|
nt_status = kdi_WriteRegString(unit_key, "Identifier", pstr);
|
|
|
|
switch(((DeviceDescriptorPtr)device_descriptor)->fdc_type) {
|
|
case FDC_UNKNOWN: pstr = "FDC_UNKNOWN"; break;
|
|
case FDC_NORMAL: pstr = "FDC_NORMAL"; break;
|
|
case FDC_ENHANCED: pstr = "FDC_ENHANCED"; break;
|
|
case FDC_82077: pstr = "FDC_82077"; break;
|
|
case FDC_82077AA: pstr = "FDC_82077AA"; break;
|
|
case FDC_82078_44: pstr = "FDC_82078_44"; break;
|
|
case FDC_82078_64: pstr = "FDC_82078_64"; break;
|
|
case FDC_NATIONAL: pstr = "FDC_NATIONAL"; break;
|
|
default: pstr = "Default";
|
|
}
|
|
|
|
nt_status = kdi_WriteRegString(unit_key, "FDCType", pstr);
|
|
|
|
pstr = "";
|
|
if (((DeviceCfgPtr)device_cfg)->supported_rates & XFER_2Mbps) {
|
|
pstr = "2Mbps";
|
|
} else
|
|
if (((DeviceCfgPtr)device_cfg)->supported_rates & XFER_1Mbps) {
|
|
pstr = "1Mbps";
|
|
} else
|
|
if (((DeviceCfgPtr)device_cfg)->supported_rates & XFER_500Kbps) {
|
|
pstr = "500Kbps";
|
|
} else
|
|
if (((DeviceCfgPtr)device_cfg)->supported_rates & XFER_250Kbps) {
|
|
pstr = "250Kbps";
|
|
}
|
|
|
|
nt_status = kdi_WriteRegString(unit_key, "FDCTransferSpeed", pstr);
|
|
|
|
|
|
switch (((DeviceDescriptorPtr)device_descriptor)->drive_class) {
|
|
case QIC40_DRIVE: pstr = "QIC-40"; break;
|
|
case QIC80_DRIVE: pstr = "QIC-80"; break;
|
|
case QIC3010_DRIVE: pstr = "QIC-3010"; break;
|
|
case QIC3020_DRIVE: pstr = "QIC-3020"; break;
|
|
case QIC80W_DRIVE: pstr = "QIC-80W"; break;
|
|
default: pstr = "Unknown";
|
|
}
|
|
nt_status = kdi_WriteRegString(unit_key, "DriveClass", pstr);
|
|
|
|
ZwClose(unit_key);
|
|
|
|
return;
|
|
|
|
}
|