166 lines
5.1 KiB
C
166 lines
5.1 KiB
C
|
/****************************************************************************/
|
||
|
// keynode.h
|
||
|
//
|
||
|
// Copyright (C) 1997-1999 Microsoft Corp.
|
||
|
/****************************************************************************/
|
||
|
|
||
|
#ifndef _TS_APP_CMP_KEY_NODE_H_
|
||
|
#define _TS_APP_CMP_KEY_NODE_H_
|
||
|
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <ntexapi.h>
|
||
|
#include <ntregapi.h>
|
||
|
#include <windows.h>
|
||
|
|
||
|
|
||
|
// some utility macros
|
||
|
#define DELETE_AND_NULL( x ) {if (x) {delete x;} x = NULL;}
|
||
|
|
||
|
// ---------------- KEY BASIC INFO
|
||
|
// Use this object as scratch pad when aquirng basic key information.
|
||
|
class KeyBasicInfo
|
||
|
{
|
||
|
public:
|
||
|
KeyBasicInfo();
|
||
|
~KeyBasicInfo();
|
||
|
|
||
|
ULONG Size() { return size ; }
|
||
|
KEY_BASIC_INFORMATION *Ptr() { return pInfo; }
|
||
|
KEY_INFORMATION_CLASS Type() { return KeyBasicInformation ; }
|
||
|
NTSTATUS Status() { return status; }
|
||
|
|
||
|
PCWSTR NameSz();// this allocates memory, so it's here for debug only
|
||
|
|
||
|
|
||
|
private:
|
||
|
ULONG size;
|
||
|
KEY_BASIC_INFORMATION *pInfo;
|
||
|
ULONG status;
|
||
|
WCHAR *pNameSz;
|
||
|
};
|
||
|
|
||
|
|
||
|
#if 0 // not used yet!
|
||
|
// ---------------- KEY NODE INFO
|
||
|
class KeyNodeInfo
|
||
|
{
|
||
|
public:
|
||
|
KeyNodeInfo();
|
||
|
~KeyNodeInfo();
|
||
|
|
||
|
ULONG Size() { return size ; }
|
||
|
KEY_NODE_INFORMATION *Ptr() { return pInfo; }
|
||
|
KEY_INFORMATION_CLASS Type() { return KeyNodeInformation ; }
|
||
|
NTSTATUS Status() { return status; }
|
||
|
|
||
|
private:
|
||
|
ULONG size;
|
||
|
KEY_NODE_INFORMATION *pInfo;
|
||
|
ULONG status;
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// ---------------- KEY FULL INFO
|
||
|
// Use this class to create objects that are used as scratch pad when
|
||
|
// acquiring full-key-info.
|
||
|
class KeyFullInfo
|
||
|
{
|
||
|
public:
|
||
|
KeyFullInfo(); // does memory allocation, check status
|
||
|
~KeyFullInfo();
|
||
|
|
||
|
ULONG Size() { return size ; }
|
||
|
KEY_FULL_INFORMATION *Ptr() { return pInfo; }
|
||
|
KEY_INFORMATION_CLASS Type() { return KeyFullInformation ; }
|
||
|
NTSTATUS Status() { return status; }
|
||
|
|
||
|
private:
|
||
|
ULONG size;
|
||
|
KEY_FULL_INFORMATION *pInfo;
|
||
|
ULONG status;
|
||
|
};
|
||
|
|
||
|
|
||
|
// This class is used to describe a key-node, which is equivalent to a reg-key abstraction.
|
||
|
// All key operation are caried thru this class, with the exception of key-enum, which is still
|
||
|
// handled as a raw NT call.
|
||
|
//
|
||
|
// All Methods set status, which can be acquired by calling Status(), or, in most
|
||
|
// cases, it is returned by the Method called.
|
||
|
class KeyNode
|
||
|
{
|
||
|
public:
|
||
|
KeyNode(HANDLE root, ACCESS_MASK access, PCWSTR name ); // init stuff
|
||
|
KeyNode(KeyNode *parent, KeyBasicInfo *info ); // init stuff
|
||
|
~KeyNode();
|
||
|
|
||
|
NTSTATUS GetPath( PWCHAR *pwch ); // get the full path to this key
|
||
|
|
||
|
NTSTATUS Open(); // casue the key to be opened, as defined by params passed to the constructorA
|
||
|
NTSTATUS Close(); // will close the key (presumed open)
|
||
|
|
||
|
NTSTATUS Create(UNICODE_STRING *uClass=NULL); // create a single new key under an existing key
|
||
|
|
||
|
NTSTATUS CreateEx( UNICODE_STRING *uClass=NULL); // Create a single branch that potentially has
|
||
|
// a multiple levels of new keys such as
|
||
|
// x1/x2/x3 under an existing key-X.
|
||
|
// Key path specified to the constructire MUST be
|
||
|
// a full path, starting with \Registry\etc
|
||
|
|
||
|
NTSTATUS Delete(); // delete an existing key
|
||
|
NTSTATUS DeleteSubKeys(); // delete the sub tree
|
||
|
|
||
|
NTSTATUS GetFullInfo( KeyFullInfo **p);
|
||
|
|
||
|
NTSTATUS Query( KEY_BASIC_INFORMATION **result , ULONG *resultSize );
|
||
|
NTSTATUS Query( KEY_NODE_INFORMATION **result , ULONG *resultSize );
|
||
|
NTSTATUS Query( KEY_FULL_INFORMATION **result , ULONG *resultSize );
|
||
|
|
||
|
NTSTATUS Status() {return status;}
|
||
|
HANDLE Key() {return hKey; }
|
||
|
WCHAR *Name() {return uniName.Buffer ;}
|
||
|
ACCESS_MASK Masks() {return accessMask ; }
|
||
|
|
||
|
|
||
|
enum DebugType
|
||
|
{
|
||
|
DBG_OPEN,
|
||
|
DBG_OPEN_FAILED,
|
||
|
DBG_DELETE,
|
||
|
DBG_KEY_NAME,
|
||
|
DBG_CREATE
|
||
|
};
|
||
|
|
||
|
void Debug(DebugType );
|
||
|
|
||
|
// if debug=TRUE, then the Debug() func will spit out stuff
|
||
|
static BOOLEAN debug;
|
||
|
|
||
|
private:
|
||
|
NTSTATUS EnumerateAndDeleteSubKeys( KeyNode *, KeyBasicInfo *);
|
||
|
|
||
|
PCWSTR NameSz(); // this allocates memory, so it's here for debug
|
||
|
// since you don't really need this, and it's private
|
||
|
|
||
|
WCHAR *pNameSz;
|
||
|
|
||
|
HANDLE root;
|
||
|
HANDLE hKey;
|
||
|
UNICODE_STRING uniName;
|
||
|
OBJECT_ATTRIBUTES ObjAttr;
|
||
|
ACCESS_MASK accessMask;
|
||
|
NTSTATUS status;
|
||
|
|
||
|
// key infos
|
||
|
KeyBasicInfo *basic;
|
||
|
KeyFullInfo *full;
|
||
|
|
||
|
PVOID pFullPath; // full reg key path, as in \Registr\...blah...blah...\Ts...\blah
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|