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.
 
 
 
 
 
 

252 lines
5.2 KiB

/* --------------------------------------------------------------------
File : reg.h
Title : registry look up routine used for netbios transport
Description :
History :
19-1-95 Tony Chan
-------------------------------------------------------------------- */
#ifndef _REGH
#define _REGH
#include "common.h"
#define MAX_LANA 255
/* for registry lookup */
PROTOCOL_MAP ProtoToLana[MAX_LANA] = { 0};
/* number of Network cards */
int NumCards;
#define ProtocolTable ProtoToLana
#define RPC_REG_ROOT HKEY_LOCAL_MACHINE
#define REG_NETBIOS "Software\\Microsoft\\Rpc\\NetBios"
// The maximum send is the size of four user data frames on an ethernet.
#define HOSTNAME_LEN NETBIOS_NAME_LENGTH
void
unicode_to_ascii ( RPC_CHAR * in, unsigned char * out )
{
unsigned char *ascii_ptr;
RPC_CHAR *unicode_ptr;
ascii_ptr = out;
unicode_ptr = in;
*ascii_ptr = (unsigned char) *unicode_ptr ;
while (1)
{
if (*ascii_ptr == 0) return;
ascii_ptr++;
unicode_ptr++;
*ascii_ptr = (unsigned char) *unicode_ptr;
}
}
void
InitialNtRegistry(
)
/*++
Routine Description:
This information is automatically generated by NT setup and the Networks
Control Panel applet. Because it can change dynamically, we load it
all at once to achieve consistent data.
Arguments:
None
ReturnValue:
None
--*/
{
HKEY RegHandle;
LONG status;
int i;
char protseq[64];
DWORD protseq_len;
DWORD lana;
DWORD lana_len;
DWORD data_type;
char * LanaString ;
int LanaNum;
// Return immediately if the table is already initialized.
if (ProtocolTable[0].ProtoSeq)
{
return;
}
NumCards = 0;
// Open the registry key for RPC NetBIOS information
status = RegOpenKeyExA(RPC_REG_ROOT,
REG_NETBIOS,
0,
KEY_READ,
&RegHandle);
ASSERT(!status);
if (status)
{
return;
}
for (i = 0; !status && i < MAX_LANA; i++)
{
protseq_len = sizeof(protseq);
lana_len = sizeof(lana);
status = RegEnumValueA(RegHandle,
i,
protseq,
&protseq_len,
NULL,
&data_type,
(LPBYTE) &lana,
&lana_len);
if (!status && data_type == REG_DWORD && lana <= MAX_LANA)
{
ProtocolTable[i].ProtoSeq = I_RpcAllocate(protseq_len + 1);
ASSERT(ProtocolTable[i].ProtoSeq);
if (! ProtocolTable[i].ProtoSeq)
{
status = RPC_S_OUT_OF_RESOURCES;
}
else
{
strcpy(ProtocolTable[i].ProtoSeq, protseq);
ProtocolTable[i].Lana = (unsigned char) lana;
LanaString = protseq + strlen(protseq) -1;
LanaNum = atoi(LanaString);
#ifdef TONY
PrintToDebugger("RPCLTSCM: the current lana examinging is %d \n"
, LanaNum);
#endif
/* find out how many cards we have */
if(NumCards < LanaNum)
{
NumCards = LanaNum;
}
}
}
else
{
ASSERT(status == ERROR_NO_MORE_ITEMS);
}
}
RegCloseKey(RegHandle);
return;
}
RPC_STATUS
MapProtocol(
IN RPC_CHAR *ProtoSeq,
IN int DriverNumber,
OUT PPROTOCOL_MAP *ProtocolEntry
)
/*++
Routine Description:
This function maps a protocol string into a protocol map entry.
Arguments:
ProtoSeq - the protocol sequence that we want to map
DriverNumber - the logical driver number for the protocol.
ProtocolEntry - pointer to place to return the results.
Return Value:
RPC_S_OK, RPC_S_OUT_OF_RESOURCES, RPC_S_INVALID_ENDPOINT_FORMAT
The output pointer is set to the corresponding entry when found.
--*/
{
long status;
char Protocol[40];
char LanaString[10];
long BufferLength = sizeof(LanaString);
int i;
// Copy the possible unicode protocol string to ascii.
for (i = 0; (Protocol[i] = (char) ProtoSeq[i]) && i < sizeof(Protocol);
i++) ;
// Add the logical driver number to the protocol string. This
// allows multiple drivers (net cards) to be attached to the same
// logical protocol.
Protocol[i] = (char) ('0' + DriverNumber);
Protocol[i+1] = 0;
// First look in the proto sequences that we have already mapped.
for (i = 0; ProtocolTable[i].ProtoSeq && i < MAX_LANA; i++)
{
// If found, set the output pointer.
if (strcmp(ProtocolTable[i].ProtoSeq, Protocol) == 0)
{
*ProtocolEntry = &ProtocolTable[i];
return(RPC_S_OK);
}
}
return(RPC_S_PROTSEQ_NOT_FOUND);
}
#endif