Blame winpr/libwinpr/registry/registry.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Windows Registry
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/registry.h>
Packit 1fb8d4
Packit 1fb8d4
/*
Packit 1fb8d4
 * Windows registry MSDN pages:
Packit 1fb8d4
 * Reference: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724880/
Packit 1fb8d4
 * Functions: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724875/
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#if !defined(_WIN32) || defined(_UWP)
Packit 1fb8d4
Packit 1fb8d4
#include <stdio.h>
Packit 1fb8d4
#include <stdlib.h>
Packit 1fb8d4
#include <string.h>
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
Packit 1fb8d4
#include "registry_reg.h"
Packit 1fb8d4
Packit 1fb8d4
static Reg* instance = NULL;
Packit 1fb8d4
Packit 1fb8d4
static Reg* RegGetInstance()
Packit 1fb8d4
{
Packit 1fb8d4
	if (!instance)
Packit 1fb8d4
	{
Packit 1fb8d4
		instance = reg_open(1);
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return instance;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegCloseKey(HKEY hKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegCopyTreeW(HKEY hKeySrc, LPCWSTR lpSubKey, HKEY hKeyDest)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegCopyTreeA(HKEY hKeySrc, LPCSTR lpSubKey, HKEY hKeyDest)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegCreateKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD Reserved, LPWSTR lpClass, DWORD dwOptions,
Packit Service 5a9772
                     REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult,
Packit Service 5a9772
                     LPDWORD lpdwDisposition)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegCreateKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD Reserved, LPSTR lpClass, DWORD dwOptions,
Packit Service 5a9772
                     REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes, PHKEY phkResult,
Packit Service 5a9772
                     LPDWORD lpdwDisposition)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteKeyExW(HKEY hKey, LPCWSTR lpSubKey, REGSAM samDesired, DWORD Reserved)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteKeyExA(HKEY hKey, LPCSTR lpSubKey, REGSAM samDesired, DWORD Reserved)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteTreeW(HKEY hKey, LPCWSTR lpSubKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteTreeA(HKEY hKey, LPCSTR lpSubKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteValueW(HKEY hKey, LPCWSTR lpValueName)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegDisablePredefinedCacheEx(void)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegEnumKeyExW(HKEY hKey, DWORD dwIndex, LPWSTR lpName, LPDWORD lpcName, LPDWORD lpReserved,
Packit Service 5a9772
                   LPWSTR lpClass, LPDWORD lpcClass, PFILETIME lpftLastWriteTime)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegEnumKeyExA(HKEY hKey, DWORD dwIndex, LPSTR lpName, LPDWORD lpcName, LPDWORD lpReserved,
Packit Service 5a9772
                   LPSTR lpClass, LPDWORD lpcClass, PFILETIME lpftLastWriteTime)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegEnumValueW(HKEY hKey, DWORD dwIndex, LPWSTR lpValueName, LPDWORD lpcchValueName,
Packit Service 5a9772
                   LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegEnumValueA(HKEY hKey, DWORD dwIndex, LPSTR lpValueName, LPDWORD lpcchValueName,
Packit Service 5a9772
                   LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegFlushKey(HKEY hKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegGetKeySecurity(HKEY hKey, SECURITY_INFORMATION SecurityInformation,
Packit Service 5a9772
                       PSECURITY_DESCRIPTOR pSecurityDescriptor, LPDWORD lpcbSecurityDescriptor)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegGetValueW(HKEY hkey, LPCWSTR lpSubKey, LPCWSTR lpValue, DWORD dwFlags, LPDWORD pdwType,
Packit Service 5a9772
                  PVOID pvData, LPDWORD pcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegGetValueA(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType,
Packit Service 5a9772
                  PVOID pvData, LPDWORD pcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegLoadAppKeyW(LPCWSTR lpFile, PHKEY phkResult, REGSAM samDesired, DWORD dwOptions,
Packit Service 5a9772
                    DWORD Reserved)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegLoadAppKeyA(LPCSTR lpFile, PHKEY phkResult, REGSAM samDesired, DWORD dwOptions,
Packit Service 5a9772
                    DWORD Reserved)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegLoadKeyW(HKEY hKey, LPCWSTR lpSubKey, LPCWSTR lpFile)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegLoadKeyA(HKEY hKey, LPCSTR lpSubKey, LPCSTR lpFile)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegLoadMUIStringW(HKEY hKey, LPCWSTR pszValue, LPWSTR pszOutBuf, DWORD cbOutBuf,
Packit Service 5a9772
                       LPDWORD pcbData, DWORD Flags, LPCWSTR pszDirectory)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegLoadMUIStringA(HKEY hKey, LPCSTR pszValue, LPSTR pszOutBuf, DWORD cbOutBuf, LPDWORD pcbData,
Packit Service 5a9772
                       DWORD Flags, LPCSTR pszDirectory)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegNotifyChangeKeyValue(HKEY hKey, BOOL bWatchSubtree, DWORD dwNotifyFilter, HANDLE hEvent,
Packit Service 5a9772
                             BOOL fAsynchronous)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegOpenCurrentUser(REGSAM samDesired, PHKEY phkResult)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegOpenKeyExA(HKEY hKey, LPCSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Packit 1fb8d4
{
Packit 1fb8d4
	Reg* reg;
Packit 1fb8d4
	RegKey* pKey;
Packit 1fb8d4
Packit 1fb8d4
	reg = RegGetInstance();
Packit 1fb8d4
Packit 1fb8d4
	if (!reg)
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	pKey = reg->root_key->subkeys;
Packit 1fb8d4
Packit 1fb8d4
	while (pKey != NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (_stricmp(pKey->subname, lpSubKey) == 0)
Packit 1fb8d4
		{
Packit Service 5a9772
			*phkResult = (HKEY)pKey;
Packit 1fb8d4
			return ERROR_SUCCESS;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		pKey = pKey->next;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	*phkResult = NULL;
Packit 1fb8d4
Packit 1fb8d4
	return ERROR_FILE_NOT_FOUND;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegOpenUserClassesRoot(HANDLE hToken, DWORD dwOptions, REGSAM samDesired, PHKEY phkResult)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegQueryInfoKeyW(HKEY hKey, LPWSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved,
Packit Service 5a9772
                      LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen,
Packit Service 5a9772
                      LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen,
Packit Service 5a9772
                      LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegQueryInfoKeyA(HKEY hKey, LPSTR lpClass, LPDWORD lpcClass, LPDWORD lpReserved,
Packit Service 5a9772
                      LPDWORD lpcSubKeys, LPDWORD lpcMaxSubKeyLen, LPDWORD lpcMaxClassLen,
Packit Service 5a9772
                      LPDWORD lpcValues, LPDWORD lpcMaxValueNameLen, LPDWORD lpcMaxValueLen,
Packit Service 5a9772
                      LPDWORD lpcbSecurityDescriptor, PFILETIME lpftLastWriteTime)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegQueryValueExW(HKEY hKey, LPCWSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,
Packit Service 5a9772
                      LPBYTE lpData, LPDWORD lpcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return ERROR_FILE_NOT_FOUND;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegQueryValueExA(HKEY hKey, LPCSTR lpValueName, LPDWORD lpReserved, LPDWORD lpType,
Packit Service 5a9772
                      LPBYTE lpData, LPDWORD lpcbData)
Packit 1fb8d4
{
Packit 1fb8d4
	RegKey* key;
Packit 1fb8d4
	RegVal* pValue;
Packit 1fb8d4
Packit Service 5a9772
	key = (RegKey*)hKey;
Packit 1fb8d4
	pValue = key->values;
Packit 1fb8d4
Packit 1fb8d4
	while (pValue != NULL)
Packit 1fb8d4
	{
Packit 1fb8d4
		if (strcmp(pValue->name, lpValueName) == 0)
Packit 1fb8d4
		{
Packit 1fb8d4
			if (pValue->type == REG_DWORD)
Packit 1fb8d4
			{
Packit Service 5a9772
				DWORD* pData = (DWORD*)lpData;
Packit 1fb8d4
Packit 1fb8d4
				if (pData != NULL)
Packit 1fb8d4
				{
Packit 1fb8d4
					*pData = pValue->data.dword;
Packit 1fb8d4
				}
Packit 1fb8d4
Packit 1fb8d4
				*lpcbData = sizeof(DWORD);
Packit 1fb8d4
Packit 1fb8d4
				return ERROR_SUCCESS;
Packit 1fb8d4
			}
Packit 1fb8d4
			else if (pValue->type == REG_SZ)
Packit 1fb8d4
			{
Packit Service 5a9772
				size_t length;
Packit Service 5a9772
				char* pData = (char*)lpData;
Packit 1fb8d4
Packit Service 5a9772
				length = strnlen(pValue->data.string, INT_MAX);
Packit 1fb8d4
Packit 1fb8d4
				if (pData != NULL)
Packit 1fb8d4
				{
Packit 1fb8d4
					memcpy(pData, pValue->data.string, length);
Packit 1fb8d4
					pData[length] = '\0';
Packit 1fb8d4
				}
Packit 1fb8d4
Packit Service 5a9772
				*lpcbData = (UINT32)length;
Packit 1fb8d4
Packit 1fb8d4
				return ERROR_SUCCESS;
Packit 1fb8d4
			}
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		pValue = pValue->next;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return ERROR_FILE_NOT_FOUND;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegRestoreKeyW(HKEY hKey, LPCWSTR lpFile, DWORD dwFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegRestoreKeyA(HKEY hKey, LPCSTR lpFile, DWORD dwFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegSaveKeyExW(HKEY hKey, LPCWSTR lpFile, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
Packit Service 5a9772
                   DWORD Flags)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegSaveKeyExA(HKEY hKey, LPCSTR lpFile, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
Packit Service 5a9772
                   DWORD Flags)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegSetKeySecurity(HKEY hKey, SECURITY_INFORMATION SecurityInformation,
Packit Service 5a9772
                       PSECURITY_DESCRIPTOR pSecurityDescriptor)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegSetValueExW(HKEY hKey, LPCWSTR lpValueName, DWORD Reserved, DWORD dwType,
Packit Service 5a9772
                    const BYTE* lpData, DWORD cbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
LONG RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, const BYTE* lpData,
Packit Service 5a9772
                    DWORD cbData)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegUnLoadKeyW(HKEY hKey, LPCWSTR lpSubKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
LONG RegUnLoadKeyA(HKEY hKey, LPCSTR lpSubKey)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif