windows-nt/Source/XPSP1/NT/termsrv/tsappcmp/keynode.h
2020-09-26 16:20:57 +08:00

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