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.
351 lines
7.7 KiB
351 lines
7.7 KiB
/******************************************************************************\
|
|
* *
|
|
* RegistryAPi.C - Adapter control related code. *
|
|
* *
|
|
* Copyright (c) C-Cube Microsystems 1996 - 1999 *
|
|
* All Rights Reserved. *
|
|
* *
|
|
* Use of C-Cube Microsystems code is governed by terms and conditions *
|
|
* stated in the accompanying licensing statement. *
|
|
* *
|
|
\******************************************************************************/
|
|
|
|
// C related include files.
|
|
#include <strmini.h>
|
|
|
|
// typedef HANDLE HKEY;
|
|
|
|
|
|
#include "Registry.h"
|
|
|
|
|
|
static BOOL
|
|
GetRegistryKey( // Get registry key
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
HANDLE pszPath, // Registry Key Handle. If NULL default path is used.
|
|
HKEY * phKey); // Pointer to receive the key.
|
|
|
|
int // Return value read from registry.
|
|
REG_GetPrivateProfileInt( // Read int value from registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
int nDefault, // Default value.
|
|
HANDLE pszPath) // Registry Key Handle If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_DWORD;
|
|
DWORD dwSize = sizeof(DWORD);
|
|
DWORD dwData = 0;
|
|
LPBYTE lpData = (LPBYTE)&dwData;
|
|
|
|
RTL_QUERY_REGISTRY_TABLE query[] =
|
|
{
|
|
{
|
|
NULL,
|
|
RTL_QUERY_REGISTRY_DIRECT,
|
|
pszEntry,
|
|
(PVOID)lpData,
|
|
dwType,
|
|
NULL,
|
|
0
|
|
},
|
|
{
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
0
|
|
}
|
|
};
|
|
|
|
if (pszEntry == NULL)
|
|
return 0;
|
|
|
|
if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
return nDefault;
|
|
|
|
#ifdef UNICODE
|
|
|
|
if (!NT_SUCCESS(RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey, // key handle
|
|
query,
|
|
NULL,
|
|
NULL)))
|
|
#endif
|
|
|
|
return nDefault;
|
|
|
|
ZwClose( hKey );
|
|
return (int)dwData;
|
|
}
|
|
|
|
BOOL // Return TRUE on success, else FALSE.
|
|
REG_WritePrivateProfileInt( // Write int value to registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
int nValue, // Value to be written.
|
|
HANDLE pszPath) // Registry Key Handle. If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_DWORD;
|
|
DWORD dwSize = sizeof(DWORD);
|
|
DWORD dwData = (DWORD)nValue;
|
|
|
|
if (pszEntry == NULL)
|
|
return FALSE;
|
|
|
|
if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
return FALSE;
|
|
|
|
#ifdef UNICODE
|
|
if (!NT_SUCCESS(RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey,
|
|
pszEntry,
|
|
dwType,
|
|
(PVOID)&dwData,
|
|
dwSize)))
|
|
#endif
|
|
|
|
return FALSE;
|
|
|
|
ZwClose( hKey );
|
|
return TRUE;
|
|
}
|
|
|
|
long // Return value read from registry.
|
|
REG_GetPrivateProfileLong( // Read int value from registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
long lDefault, // Default value.
|
|
HANDLE pszPath) // Registry path. If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_DWORD;
|
|
DWORD dwSize = sizeof(DWORD);
|
|
DWORD dwData = 0;
|
|
LPBYTE lpData = (LPBYTE)&dwData;
|
|
|
|
RTL_QUERY_REGISTRY_TABLE query[] =
|
|
{
|
|
{
|
|
NULL,
|
|
RTL_QUERY_REGISTRY_DIRECT,
|
|
pszEntry,
|
|
(PVOID)lpData,
|
|
dwType,
|
|
&lDefault,
|
|
sizeof(long)
|
|
},
|
|
{
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
0
|
|
}
|
|
|
|
};
|
|
|
|
if (pszEntry == NULL)
|
|
return 0;
|
|
|
|
|
|
if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
return lDefault;
|
|
|
|
#ifdef UNICODE
|
|
|
|
if (!NT_SUCCESS(RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey, // key handle
|
|
query,
|
|
NULL,
|
|
NULL)))
|
|
#endif
|
|
return lDefault;
|
|
|
|
ZwClose( hKey );
|
|
return (long)dwData;
|
|
}
|
|
|
|
BOOL // Return TRUE on success, else FALSE.
|
|
REG_WritePrivateProfileLong( // Write long value to registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
long lValue, // Value to be written.
|
|
HANDLE pszPath) // Registry path. If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_DWORD;
|
|
DWORD dwSize = sizeof(DWORD);
|
|
DWORD dwData = (DWORD)lValue;
|
|
|
|
if (pszEntry == NULL)
|
|
return FALSE;
|
|
|
|
if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
return FALSE;
|
|
|
|
#ifdef UNICODE
|
|
if (!NT_SUCCESS(RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey,
|
|
pszEntry,
|
|
dwType,
|
|
(PVOID)&dwData,
|
|
dwSize)))
|
|
#endif
|
|
return FALSE;
|
|
|
|
ZwClose( hKey );
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
BOOL // Return # of chars read.
|
|
REG_GetPrivateProfileString( // Read string from registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
PTSTR pszDefault, // Pointer to default string.
|
|
PTSTR pString, // Pointer to get the string.
|
|
int nStringSize, // string size in bytes.
|
|
HANDLE pszPath) // Registry path. If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_SZ;
|
|
DWORD dwSize = (DWORD)nStringSize;
|
|
DWORD dwData = (DWORD)pString;
|
|
LPBYTE lpData = (LPBYTE)&dwData;
|
|
|
|
UNICODE_STRING string = {
|
|
(USHORT)0,
|
|
(USHORT)dwSize,
|
|
pString
|
|
};
|
|
|
|
RTL_QUERY_REGISTRY_TABLE query[] =
|
|
{
|
|
{
|
|
NULL,
|
|
RTL_QUERY_REGISTRY_DIRECT,
|
|
pszEntry,
|
|
(PVOID)&string,
|
|
dwType,
|
|
pszDefault,
|
|
STRLEN(pszDefault) * sizeof(WCHAR)
|
|
},
|
|
{
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
0,
|
|
NULL,
|
|
0
|
|
}
|
|
};
|
|
|
|
if (pszEntry == NULL)
|
|
return 0;
|
|
|
|
if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
return 0;
|
|
|
|
|
|
if (!NT_SUCCESS(RtlQueryRegistryValues(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey,
|
|
query,
|
|
NULL,
|
|
NULL)))
|
|
|
|
return 0;
|
|
|
|
ZwClose( hKey );
|
|
return (int)(STRLEN(pString));
|
|
}
|
|
|
|
int // Return # of chars written.
|
|
REG_WritePrivateProfileString( // Write the string to registry.
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
PTSTR pString, // Pointer to get the string.
|
|
HANDLE pszPath) // Registry path. If NULL default path is used.
|
|
{
|
|
HKEY hKey = NULL;
|
|
|
|
DWORD dwType = REG_SZ;
|
|
DWORD dwSize = (DWORD)(STRLEN(pString));
|
|
DWORD dwData = (DWORD)pString;
|
|
|
|
if (pszEntry == NULL)
|
|
return 0;
|
|
|
|
//if (!GetRegistryKey(pszSection, pszEntry, pszPath, &hKey))
|
|
// return 0;
|
|
|
|
|
|
if (!NT_SUCCESS(RtlWriteRegistryValue(RTL_REGISTRY_HANDLE,
|
|
(PCWSTR)hKey,
|
|
pszEntry,
|
|
dwType,
|
|
(PVOID)dwData, // note string IS address
|
|
dwSize)))
|
|
return 0;
|
|
|
|
ZwClose( hKey );
|
|
return (int)(STRLEN(pString));
|
|
}
|
|
|
|
static BOOL // Return TRUE on success, else FALSE
|
|
GetRegistryKey( // Get registry key
|
|
PTSTR pszSection, // Pointer to section.
|
|
PTSTR pszEntry, // Pointer to entry.
|
|
HANDLE pszPath, // Registry path. If NULL default path is used.
|
|
HKEY * phKey) // Pointer to receive the key.
|
|
{
|
|
NTSTATUS ntStatus;
|
|
BOOL fRet=TRUE;
|
|
UNICODE_STRING ustr;
|
|
OBJECT_ATTRIBUTES objectAttributes;
|
|
|
|
|
|
RtlInitUnicodeString( &ustr, pszSection);
|
|
|
|
InitializeObjectAttributes(
|
|
&objectAttributes,
|
|
&ustr,
|
|
OBJ_CASE_INSENSITIVE,
|
|
pszPath,
|
|
NULL);
|
|
|
|
//ntStatus = ZwCreateKey( phKey,
|
|
// KEY_ALL_ACCESS,
|
|
// &objectAttributes,
|
|
// 0,
|
|
// NULL,
|
|
// REG_OPTION_NON_VOLATILE,
|
|
// NULL);
|
|
//
|
|
// Only open existing key
|
|
//
|
|
ntStatus = ZwOpenKey( phKey,
|
|
KEY_ALL_ACCESS,
|
|
&objectAttributes);
|
|
|
|
|
|
if ( !NT_SUCCESS( ntStatus )) {
|
|
*phKey = NULL;
|
|
fRet = FALSE;
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|