197 lines
3.7 KiB
C
197 lines
3.7 KiB
C
|
/*++
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|