Windows NT 4.0 source code leak
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

/*****************************************************************************
*
* 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;
}