409 lines
9.6 KiB
C
409 lines
9.6 KiB
C
//
|
||
// Determine which -- if any -- of these routines are in use
|
||
// in sockets project and dump remainder (hopefully whole directory)
|
||
// this is ancient stuff, most of which has long been superceded
|
||
// They are actually still used.
|
||
//
|
||
|
||
#include "local.h"
|
||
|
||
#define malloc(x) RtlAllocateHeap( RtlProcessHeap(), 0, (x) )
|
||
#define free(p) RtlFreeHeap( RtlProcessHeap(), 0, (p) )
|
||
|
||
|
||
#define WORK_BUFFER_SIZE 1024
|
||
|
||
char VTCPPARM[] = "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcp\\VParameters";
|
||
char NTCPPARM[] = "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcp\\Parameters";
|
||
char TCPPARM[] = "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters";
|
||
char TTCPPARM[] = "\\Registry\\Machine\\System\\CurrentControlSet\\Services\\Tcpip\\Parameters\\Transient";
|
||
|
||
#ifdef TRACE
|
||
void
|
||
UnicodePrint(
|
||
PUNICODE_STRING UnicodeString
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Print a unicode string.
|
||
|
||
Arguments:
|
||
|
||
UnicodeString - pointer to the string.
|
||
|
||
Return Value:
|
||
|
||
None.
|
||
|
||
--*/
|
||
{
|
||
ANSI_STRING ansiString;
|
||
PUCHAR tempbuffer = (PUCHAR) malloc(WORK_BUFFER_SIZE);
|
||
|
||
ansiString.MaximumLength = WORK_BUFFER_SIZE;
|
||
ansiString.Length = 0L;
|
||
ansiString.Buffer = tempbuffer;
|
||
|
||
RtlUnicodeStringToAnsiString(&ansiString,
|
||
UnicodeString,
|
||
FALSE);
|
||
printf("%s", ansiString.Buffer);
|
||
free(tempbuffer);
|
||
return;
|
||
}
|
||
#endif
|
||
|
||
|
||
NTSTATUS
|
||
SockOpenKey(
|
||
PHANDLE HandlePtr,
|
||
PUCHAR KeyName
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS status;
|
||
STRING keyString;
|
||
OBJECT_ATTRIBUTES objectAttributes;
|
||
UNICODE_STRING unicodeKeyName;
|
||
|
||
RtlInitString(&keyString,
|
||
KeyName);
|
||
|
||
(VOID)RtlAnsiStringToUnicodeString(&unicodeKeyName,
|
||
&keyString,
|
||
TRUE);
|
||
|
||
#ifdef TRACE
|
||
printf("SockOpenKey = ");
|
||
UnicodePrint(&unicodeKeyName);
|
||
printf("\n");
|
||
#endif
|
||
|
||
memset(&objectAttributes, 0, sizeof(OBJECT_ATTRIBUTES));
|
||
InitializeObjectAttributes(&objectAttributes,
|
||
&unicodeKeyName,
|
||
OBJ_CASE_INSENSITIVE,
|
||
NULL,
|
||
NULL);
|
||
|
||
status = NtOpenKey(HandlePtr,
|
||
KEY_READ,
|
||
&objectAttributes);
|
||
|
||
RtlFreeUnicodeString(&unicodeKeyName);
|
||
|
||
#ifdef TRACE
|
||
if (!NT_SUCCESS(status)) {
|
||
printf("Failed NtOpenKey for %s => %x\n",
|
||
KeyName,
|
||
status);
|
||
}
|
||
#endif
|
||
|
||
return status;
|
||
}
|
||
|
||
NTSTATUS
|
||
SockOpenKeyEx(
|
||
PHANDLE HandlePtr,
|
||
PUCHAR KeyName1,
|
||
PUCHAR KeyName2,
|
||
PUCHAR KeyName3
|
||
)
|
||
|
||
{
|
||
NTSTATUS status;
|
||
|
||
status = SockOpenKey(HandlePtr, KeyName1);
|
||
if (NT_SUCCESS(status) || (KeyName2 == NULL && KeyName3 == NULL)) {
|
||
return status;
|
||
}
|
||
|
||
status = SockOpenKey(HandlePtr, KeyName2);
|
||
if (NT_SUCCESS(status) || KeyName3 == NULL) {
|
||
return status;
|
||
}
|
||
|
||
return SockOpenKey(HandlePtr, KeyName3);
|
||
}
|
||
|
||
|
||
|
||
NTSTATUS
|
||
SockGetSingleValue(
|
||
HANDLE KeyHandle,
|
||
PUCHAR ValueName,
|
||
PUCHAR ValueData,
|
||
PULONG ValueType,
|
||
ULONG ValueLength
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS status;
|
||
ULONG resultLength;
|
||
PKEY_VALUE_FULL_INFORMATION keyValueFullInformation;
|
||
UNICODE_STRING uValueName;
|
||
ANSI_STRING aValueName;
|
||
UNICODE_STRING uValueData;
|
||
ANSI_STRING aValueData;
|
||
|
||
|
||
#ifdef TRACE
|
||
printf("SockGetSingleValue: %s\n", ValueName);
|
||
#endif
|
||
if ((keyValueFullInformation =
|
||
(PKEY_VALUE_FULL_INFORMATION)malloc(WORK_BUFFER_SIZE)) == NULL) {
|
||
return(STATUS_NO_MEMORY);
|
||
}
|
||
|
||
|
||
RtlZeroMemory(keyValueFullInformation, WORK_BUFFER_SIZE);
|
||
|
||
uValueName.Length = 0L;
|
||
uValueName.MaximumLength = WORK_BUFFER_SIZE;
|
||
|
||
if ((uValueName.Buffer = (PWSTR)malloc(WORK_BUFFER_SIZE)) == NULL) {
|
||
free(keyValueFullInformation);
|
||
return(STATUS_NO_MEMORY);
|
||
}
|
||
|
||
aValueName.MaximumLength = WORK_BUFFER_SIZE;
|
||
aValueName.Length = (USHORT) strlen(ValueName);
|
||
aValueName.Buffer = (PCHAR)ValueName;
|
||
|
||
RtlAnsiStringToUnicodeString(&uValueName,
|
||
&aValueName,
|
||
FALSE);
|
||
|
||
status = NtQueryValueKey(KeyHandle,
|
||
&uValueName,
|
||
KeyValueFullInformation,
|
||
keyValueFullInformation,
|
||
WORK_BUFFER_SIZE,
|
||
&resultLength);
|
||
|
||
if (!NT_SUCCESS(status)) {
|
||
free(uValueName.Buffer);
|
||
free(keyValueFullInformation);
|
||
return status;
|
||
}
|
||
|
||
*ValueType = keyValueFullInformation->Type;
|
||
|
||
if (*ValueType != REG_DWORD && *ValueType != REG_BINARY) {
|
||
|
||
aValueData.Length = 0L;
|
||
|
||
if (*ValueType == REG_EXPAND_SZ) {
|
||
|
||
aValueData.Buffer = (PVOID)uValueName.Buffer;
|
||
aValueData.MaximumLength = WORK_BUFFER_SIZE;
|
||
|
||
} else {
|
||
|
||
free(uValueName.Buffer);
|
||
aValueData.Buffer = (PCHAR)ValueData;
|
||
aValueData.MaximumLength = (USHORT)ValueLength;
|
||
|
||
}
|
||
|
||
uValueData.Length = (USHORT)keyValueFullInformation->DataLength;
|
||
uValueData.MaximumLength = (USHORT)keyValueFullInformation->DataLength;
|
||
uValueData.Buffer = (PWSTR)((PCHAR)keyValueFullInformation +
|
||
keyValueFullInformation->DataOffset);
|
||
|
||
RtlUnicodeStringToAnsiString(&aValueData,
|
||
&uValueData,
|
||
FALSE);
|
||
|
||
if (*ValueType == REG_EXPAND_SZ) {
|
||
resultLength = ExpandEnvironmentStringsA(
|
||
aValueData.Buffer,
|
||
ValueData,
|
||
ValueLength);
|
||
free(aValueData.Buffer);
|
||
}
|
||
|
||
} else {
|
||
*((PULONG)ValueData) = *((PULONG)((PCHAR)keyValueFullInformation +
|
||
keyValueFullInformation->DataOffset));
|
||
free(uValueName.Buffer);
|
||
}
|
||
|
||
free(keyValueFullInformation);
|
||
return status;
|
||
}
|
||
|
||
NTSTATUS
|
||
SockSetSingleValue(
|
||
HANDLE KeyHandle,
|
||
PUCHAR ValueName,
|
||
PUCHAR ValueData,
|
||
ULONG ValueType,
|
||
ULONG ValueLength
|
||
)
|
||
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
|
||
{
|
||
NTSTATUS status;
|
||
UNICODE_STRING uValueName;
|
||
ANSI_STRING aValueName;
|
||
UNICODE_STRING uData;
|
||
ANSI_STRING aData;
|
||
BOOL fallocatedUdata = FALSE;
|
||
|
||
#ifdef TRACE
|
||
printf("SockSetSingleValue: %s\n", ValueName);
|
||
#endif
|
||
|
||
uValueName.Length = 0L;
|
||
uValueName.MaximumLength = WORK_BUFFER_SIZE;
|
||
|
||
//
|
||
// Convert the key name to unicode.
|
||
//
|
||
|
||
if ((uValueName.Buffer = (PWSTR)malloc(WORK_BUFFER_SIZE)) == NULL) {
|
||
return(STATUS_NO_MEMORY);
|
||
} else {
|
||
aValueName.MaximumLength = WORK_BUFFER_SIZE;
|
||
aValueName.Length = (USHORT) strlen(ValueName);
|
||
aValueName.Buffer = (PCHAR)ValueName;
|
||
|
||
RtlAnsiStringToUnicodeString(&uValueName,
|
||
&aValueName,
|
||
FALSE);
|
||
}
|
||
|
||
if ( ValueType == REG_SZ || ValueType == REG_MULTI_SZ ) {
|
||
|
||
if ((uData.Buffer = (PWSTR)malloc(WORK_BUFFER_SIZE)) == NULL)
|
||
{
|
||
free( uValueName.Buffer );
|
||
return(STATUS_NO_MEMORY);
|
||
}
|
||
fallocatedUdata = TRUE;
|
||
uData.MaximumLength = WORK_BUFFER_SIZE;
|
||
|
||
//
|
||
// Need to convert the value data from ASCII to unicode
|
||
// before writing it to the registry
|
||
//
|
||
|
||
aData.Length = (USHORT)ValueLength;
|
||
aData.MaximumLength = aData.Length;
|
||
aData.Buffer = ValueData;
|
||
|
||
RtlAnsiStringToUnicodeString(&uData,
|
||
&aData,
|
||
FALSE);
|
||
} else {
|
||
uData.Buffer = (PWCHAR)ValueData;
|
||
uData.Length = (USHORT)ValueLength;
|
||
}
|
||
|
||
status = NtSetValueKey(KeyHandle,
|
||
&uValueName,
|
||
0,
|
||
ValueType,
|
||
uData.Buffer,
|
||
uData.Length );
|
||
|
||
if ( fallocatedUdata )
|
||
{
|
||
free( uData.Buffer );
|
||
}
|
||
free(uValueName.Buffer);
|
||
|
||
return status;
|
||
}
|
||
|
||
|
||
|
||
FILE *
|
||
SockOpenNetworkDataBase(
|
||
IN char *Database,
|
||
OUT char *Pathname,
|
||
IN int PathnameLen,
|
||
IN char *OpenFlags
|
||
)
|
||
{
|
||
PUCHAR temp;
|
||
HANDLE myKey;
|
||
NTSTATUS status;
|
||
ULONG myType;
|
||
|
||
//
|
||
// Try to open both TCP/IP parameters keys, both old stack and new
|
||
// stack.
|
||
//
|
||
|
||
status = SockOpenKeyEx(&myKey, VTCPPARM, NTCPPARM, TCPPARM);
|
||
if (!NT_SUCCESS(status)) {
|
||
SetLastError( ERROR_CANTOPEN );
|
||
return(NULL);
|
||
}
|
||
|
||
if ((temp=malloc(WORK_BUFFER_SIZE))==NULL) {
|
||
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
|
||
NtClose(myKey);
|
||
return(NULL);
|
||
}
|
||
|
||
status = SockGetSingleValue(myKey, "DatabasePath", temp, &myType, WORK_BUFFER_SIZE);
|
||
NtClose(myKey);
|
||
|
||
if (!NT_SUCCESS(status)) {
|
||
SetLastError( ERROR_CANTREAD );
|
||
free(temp);
|
||
return(NULL);
|
||
}
|
||
|
||
if ( ((int) (strlen(temp) + strlen(Database) + 2)) > PathnameLen) {
|
||
SetLastError( ERROR_INSUFFICIENT_BUFFER );
|
||
free(temp);
|
||
return(NULL);
|
||
}
|
||
|
||
strcpy(Pathname, temp);
|
||
strcat(Pathname, "\\");
|
||
strcat(Pathname, Database);
|
||
|
||
free(temp);
|
||
return(fopen(Pathname, OpenFlags));
|
||
}
|
||
|
||
|