windows-nt/Source/XPSP1/NT/printscan/print/spooler/spoolss/dll/netid.c

197 lines
3.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
/*++
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);
}