mirror of https://github.com/lianthony/NT4.0
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.
179 lines
3.7 KiB
179 lines
3.7 KiB
/*++
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
open.c
|
|
|
|
Abstract:
|
|
|
|
This file implements the RegOpenKey function for dos and win 3.0.
|
|
|
|
Author:
|
|
|
|
Dave Steckler (davidst) - 3/27/92
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <rpc.h>
|
|
#include <regapi.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <malloc.h>
|
|
|
|
#include <rpcreg.h>
|
|
#include <globals.h>
|
|
|
|
long
|
|
RPC_ENTRY
|
|
RegOpenKey (
|
|
HKEY hKey,
|
|
LPCSTR lpSubKey,
|
|
PHKEY phkResult
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine opens a key in the registry based on another key in the
|
|
registry.
|
|
|
|
Arguments:
|
|
|
|
hKey Handle to previously opened key. Can be one of the
|
|
system defined keys.
|
|
|
|
lpSubKey Name of subkey to open.
|
|
|
|
phkResult Handle of key that is opened.
|
|
|
|
Return Value:
|
|
|
|
ERROR_SUCCESS
|
|
ERROR_BADDB
|
|
ERROR_BADKEY
|
|
ERROR_CANTOPEN
|
|
ERROR_CANTREAD
|
|
ERROR_OUTOFMEMORY
|
|
|
|
--*/
|
|
|
|
{
|
|
int FullKeyNameLen;
|
|
|
|
#ifdef WIN
|
|
static
|
|
#endif
|
|
char FullKeyName[MAX_KEY_NAME_LEN+1];
|
|
|
|
#ifdef WIN
|
|
static
|
|
#endif
|
|
char LineInFile[MAX_DATA_FILE_LINE_LEN+1];
|
|
|
|
char * pParse;
|
|
PRPC_REG_HANDLE pResult;
|
|
|
|
//
|
|
// Make sure the key passed in is valid.
|
|
//
|
|
|
|
ConvPreDefinedKey(hKey);
|
|
|
|
if (!KeyIsValid(hKey))
|
|
{
|
|
return ERROR_BADKEY;
|
|
}
|
|
|
|
//
|
|
// If the registry hasn't been opened yet, then do so.
|
|
//
|
|
|
|
if (!OpenRegistryFileIfNecessary())
|
|
{
|
|
return ERROR_BADDB;
|
|
}
|
|
|
|
//
|
|
// Build the full key name.
|
|
//
|
|
|
|
FullKeyNameLen = BuildFullKeyName(hKey, lpSubKey, FullKeyName);
|
|
|
|
//
|
|
// Scan the file for such a key. If we hit the end of file, then we didn't
|
|
// find the key we were looking for.
|
|
//
|
|
|
|
for (;;) // return inside loop
|
|
{
|
|
if (fgets(LineInFile, MAX_DATA_FILE_LINE_LEN+1, RegistryDataFile) ==
|
|
NULL)
|
|
{
|
|
if ( feof(RegistryDataFile) )
|
|
{
|
|
CloseRegistryFile();
|
|
return ERROR_BADKEY;
|
|
}
|
|
else
|
|
{
|
|
CloseRegistryFile();
|
|
return ERROR_CANTREAD;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Pull the keyname off the front of the string.
|
|
//
|
|
|
|
pParse = strtok(LineInFile, "=");
|
|
if (pParse == NULL)
|
|
{
|
|
CloseRegistryFile();
|
|
return ERROR_BADDB;
|
|
}
|
|
|
|
//
|
|
// Is it the one we are looking for? If so, then create a new
|
|
// "handle" and copy the full name there.
|
|
//
|
|
|
|
if ( (strncmp(pParse, FullKeyName, FullKeyNameLen) == 0) &&
|
|
(pParse[FullKeyNameLen]=='\0' || pParse[FullKeyNameLen]=='\\'))
|
|
{
|
|
pResult = _fmalloc(sizeof(RPC_REG_HANDLE)+strlen(FullKeyName)+1);
|
|
if (pResult == NULL)
|
|
{
|
|
CloseRegistryFile();
|
|
return ERROR_OUTOFMEMORY;
|
|
}
|
|
|
|
//
|
|
// Copy the name in the space immediately following the structure.
|
|
// Also set the signature.
|
|
//
|
|
|
|
pResult->Signature = RPC_REG_KEY_SIGNATURE;
|
|
pResult->pKeyName = (char PAPI *) (pResult+1);
|
|
strcpy(pResult->pKeyName, FullKeyName);
|
|
|
|
//
|
|
// Set up the return key and return successfully.
|
|
//
|
|
|
|
*phkResult = (HKEY)pResult;
|
|
|
|
return ERROR_SUCCESS;
|
|
}
|
|
}
|
|
|
|
//
|
|
// We should never get here.
|
|
//
|
|
|
|
ASSERT(!"OpenKey");
|
|
}
|