mirror of https://github.com/tongzx/nt5src
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.
408 lines
9.6 KiB
408 lines
9.6 KiB
//
|
|
// 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));
|
|
}
|
|
|
|
|