Leaked source code of windows server 2003
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.
 
 
 
 
 
 

196 lines
3.9 KiB

/*++
Copyright (c) 1990-1994 Microsoft Corporation
All rights reserved
Module Name:
netid.c
Abstract:
Author:
Environment:
User Mode -Win32
Revision History:
--*/
#include "precomp.h"
#pragma hdrstop
#define MAXNETIDS 100
extern WCHAR *szRegDevicesPath;
extern WCHAR *szDotDefault;
DWORD
GetNetworkIdWorker(
HKEY hKeyDevices,
LPWSTR pDeviceName);
LONG
wtol(
IN LPWSTR string
)
{
LONG value = 0;
while((*string != L'\0') &&
(*string >= L'0') &&
( *string <= L'9')) {
value = value * 10 + (*string - L'0');
string++;
}
return(value);
}
DWORD
GetNextNetId(
DWORD pNetTable[]
)
{
DWORD i;
for (i = 0; i < MAXNETIDS; i++) {
if (!ISBITON(pNetTable, i)) {
return(i);
}
}
return((DWORD)-1);
}
DWORD
GetNetworkId(
HKEY hKeyUser,
LPWSTR pDeviceName)
{
HKEY hKeyUserDevices;
DWORD dwNetId;
if (RegOpenKeyEx(hKeyUser,
szRegDevicesPath,
0,
KEY_READ,
&hKeyUserDevices) != ERROR_SUCCESS) {
return 0;
}
dwNetId = GetNetworkIdWorker(hKeyUserDevices,
pDeviceName);
RegCloseKey(hKeyUserDevices);
return dwNetId;
}
DWORD
GetNetworkIdWorker(
HKEY hKeyUserDevices,
LPWSTR pDeviceName)
/*++
Parses the Devices section of Win.ini to determine if the
printer device is a remote device. We determine this by checking
if the first two characters are "Ne." If they are then we know
that the next two characters are the NetId. If we find a Printer
device mapping the input pDeviceName, then return the id. If we
don't find a Printer device mapping return the next possible /
available id.
--*/
{
LPWSTR p;
WCHAR szData[MAX_PATH];
WCHAR szValue[MAX_PATH];
DWORD cchValue;
DWORD cbData;
DWORD i;
DWORD dwId;
DWORD dwError;
//
// Alloc 104 bits - but we'll use only 100 bits
//
DWORD adwNetTable[4];
memset(adwNetTable, 0, sizeof(adwNetTable));
for (i=0; TRUE; i++) {
cchValue = COUNTOF(szValue);
cbData = sizeof(szData);
dwError = RegEnumValue(hKeyUserDevices,
i,
szValue,
&cchValue,
NULL,
NULL,
(PBYTE)szData,
&cbData);
if (dwError != ERROR_SUCCESS)
break;
if (*szData) {
if (p = wcschr(szData, L',')) {
//
// null set szOutput; szPrinter is now the
// the name of our printer.
//
*p = 0;
//
// Get the Port name out of szOutput
//
p++;
while (*p == ' ') {
p++;
}
if (!_wcsnicmp(p, L"Ne", 2)) {
p += 2;
*(p+2) = L'\0';
dwId = wtol(p);
//
// if we have a match for the id, then
// use it and return, no need to generate
// a table
//
if (!wcscmp(szValue, pDeviceName)) {
return dwId;
}
//
// Error if >= 100!
//
if (dwId < 100)
MARKUSE(adwNetTable, dwId);
}
}
}
}
//
// So we didn't find the printer
//
return GetNextNetId(adwNetTable);
}