X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Flib%2Fcmlib%2Fcmlib.h;h=ca289e7451b3142b0d6a5706a03e294e08b13595;hp=9e86c926418ad3d000a7202a74daae3c1adbd1e8;hb=eae6521fb257869a049e1d4d703468a9b3ff27cc;hpb=0429c9f223345ebbd1fdf6a13e7a16fcfb4b0cb5 diff --git a/reactos/lib/cmlib/cmlib.h b/reactos/lib/cmlib/cmlib.h index 9e86c926418..ca289e7451b 100644 --- a/reactos/lib/cmlib/cmlib.h +++ b/reactos/lib/cmlib/cmlib.h @@ -8,212 +8,219 @@ #ifndef CMLIB_H #define CMLIB_H -#ifdef CMLIB_HOST -#include -#include -#include - -// Definitions copied from -// We only want to include host headers, so we define them manually -#define STATUS_SUCCESS ((NTSTATUS)0x00000000) -#define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002) -#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017) -#define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A) -#define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C) -#define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C) -#define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009) - -#endif +// +// Debug support switch +// +#define _CMLIB_DEBUG_ 1 -#ifndef _TYPEDEFS_HOST_H - #include +#ifdef CMLIB_HOST + #include + #include + #include + + // Definitions copied from + // We only want to include host headers, so we define them manually + #define STATUS_SUCCESS ((NTSTATUS)0x00000000) + #define STATUS_NOT_IMPLEMENTED ((NTSTATUS)0xC0000002) + #define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017) + #define STATUS_INSUFFICIENT_RESOURCES ((NTSTATUS)0xC000009A) + #define STATUS_REGISTRY_CORRUPT ((NTSTATUS)0xC000014C) + #define STATUS_NOT_REGISTRY_FILE ((NTSTATUS)0xC000015C) + #define STATUS_REGISTRY_RECOVERED ((NTSTATUS)0x40000009) + + #define REG_OPTION_VOLATILE 1 + #define OBJ_CASE_INSENSITIVE 0x00000040L + #define USHORT_MAX USHRT_MAX + + VOID NTAPI + KeQuerySystemTime( + OUT PLARGE_INTEGER CurrentTime); + + VOID NTAPI + RtlInitializeBitMap( + IN PRTL_BITMAP BitMapHeader, + IN PULONG BitMapBuffer, + IN ULONG SizeOfBitMap); + + ULONG NTAPI + RtlFindSetBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG NumberToFind, + IN ULONG HintIndex); + + VOID NTAPI + RtlSetBits( + IN PRTL_BITMAP BitMapHeader, + IN ULONG StartingIndex, + IN ULONG NumberToSet); + + VOID NTAPI + RtlClearAllBits( + IN PRTL_BITMAP BitMapHeader); + + #define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1) + #define UNREFERENCED_PARAMETER(P) {(P)=(P);} + + #define PKTHREAD PVOID + #define PKGUARDED_MUTEX PVOID + #define PERESOURCE PVOID + #define PFILE_OBJECT PVOID + #define PKEVENT PVOID + #define PWORK_QUEUE_ITEM PVOID + #define EX_PUSH_LOCK PULONG_PTR + + /* For */ + #define USE_HOST_WCSFUNCS + + #define CMLTRACE(x, ...) #else - #define REG_OPTION_VOLATILE 1 - #define OBJ_CASE_INSENSITIVE 0x00000040L - #define USHORT_MAX USHRT_MAX - -VOID NTAPI -KeQuerySystemTime( - OUT PLARGE_INTEGER CurrentTime); - -VOID NTAPI -RtlInitializeBitMap( - IN PRTL_BITMAP BitMapHeader, - IN PULONG BitMapBuffer, - IN ULONG SizeOfBitMap); - -ULONG NTAPI -RtlFindSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG NumberToFind, - IN ULONG HintIndex); - -VOID NTAPI -RtlSetBits( - IN PRTL_BITMAP BitMapHeader, - IN ULONG StartingIndex, - IN ULONG NumberToSet); - -VOID NTAPI -RtlClearAllBits( - IN PRTL_BITMAP BitMapHeader); - -#define RtlCheckBit(BMH,BP) (((((PLONG)(BMH)->Buffer)[(BP) / 32]) >> ((BP) % 32)) & 0x1) - + // + // Debug/Tracing support + // + #if _CMLIB_DEBUG_ + #ifdef NEW_DEBUG_SYSTEM_IMPLEMENTED // enable when Debug Filters are implemented + #define CMLTRACE DbgPrintEx + #else + #define CMLTRACE(x, ...) \ + if (x & CmlibTraceLevel) DbgPrint(__VA_ARGS__) + #endif + #else + #define CMLTRACE(x, ...) DPRINT(__VA_ARGS__) + #endif + + #include + #undef DECLSPEC_IMPORT + #define DECLSPEC_IMPORT + #include #endif -#include -#include "hivedata.h" -#include "cmdata.h" +#include + +// +// These define the Debug Masks Supported +// +#define CMLIB_HCELL_DEBUG 0x01 #ifndef ROUND_UP #define ROUND_UP(a,b) ((((a)+(b)-1)/(b))*(b)) #define ROUND_DOWN(a,b) (((a)/(b))*(b)) #endif -#define CMAPI NTAPI +// +// PAGE_SIZE definition +// +#ifndef PAGE_SIZE +#if defined(TARGET_i386) || defined(TARGET_amd64) || defined(TARGET_arm) +#define PAGE_SIZE 0x1000 +#else +#error Local PAGE_SIZE definition required when built as host +#endif +#endif -struct _HHIVE; +#define TAG_CM 0x68742020 -typedef PVOID (CMAPI *PGET_CELL_ROUTINE)( - struct _HHIVE *Hive, - HCELL_INDEX Cell); +#define CMAPI NTAPI -typedef VOID (CMAPI *PRELEASE_CELL_ROUTINE)( - struct _HHIVE *Hive, - HCELL_INDEX Cell); +#include +#include "hivedata.h" +#include "cmdata.h" -typedef PVOID (CMAPI *PALLOCATE_ROUTINE)( - SIZE_T Size, - BOOLEAN Paged); - -typedef VOID (CMAPI *PFREE_ROUTINE)( - PVOID Ptr); - -typedef BOOLEAN (CMAPI *PFILE_READ_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - ULONGLONG FileOffset, - PVOID Buffer, - SIZE_T BufferLength); - -typedef BOOLEAN (CMAPI *PFILE_WRITE_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - ULONGLONG FileOffset, - PVOID Buffer, - SIZE_T BufferLength); - -typedef BOOLEAN (CMAPI *PFILE_SET_SIZE_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType, - ULONGLONG FileSize); - -typedef BOOLEAN (CMAPI *PFILE_FLUSH_ROUTINE)( - struct _HHIVE *RegistryHive, - ULONG FileType); - -typedef struct _HMAP_ENTRY -{ - ULONG_PTR Bin; - ULONG_PTR Block; - struct _CM_VIEW_OF_FILE *CmHive; - ULONG MemAlloc; -} HMAP_ENTRY, *PHMAP_ENTRY; +#if defined(_TYPEDEFS_HOST_H) || defined(__FREELDR_H) -typedef struct _HMAP_TABLE -{ - HMAP_ENTRY Table[512]; -} HMAP_TABLE, *PHMAP_TABLE; +#define PCM_KEY_SECURITY_CACHE_ENTRY PVOID +#define PCM_KEY_CONTROL_BLOCK PVOID +#define CMP_SECURITY_HASH_LISTS 64 +#define PCM_CELL_REMAP_BLOCK PVOID -typedef struct _HMAP_DIRECTORY +// +// Use Count Log and Entry +// +typedef struct _CM_USE_COUNT_LOG_ENTRY { - PHMAP_TABLE Directory[2048]; -} HMAP_DIRECTORY, *PHMAP_DIRECTORY; + HCELL_INDEX Cell; + PVOID Stack[7]; +} CM_USE_COUNT_LOG_ENTRY, *PCM_USE_COUNT_LOG_ENTRY; -typedef struct _DUAL -{ - ULONG Length; - PHMAP_DIRECTORY Map; - PHMAP_ENTRY BlockList; // PHMAP_TABLE SmallDir; - ULONG Guard; - HCELL_INDEX FreeDisplay[24]; //FREE_DISPLAY FreeDisplay[24]; - ULONG FreeSummary; - LIST_ENTRY FreeBins; -} DUAL, *PDUAL; - -typedef struct _HHIVE +typedef struct _CM_USE_COUNT_LOG { - ULONG Signature; - PGET_CELL_ROUTINE GetCellRoutine; - PRELEASE_CELL_ROUTINE ReleaseCellRoutine; - PALLOCATE_ROUTINE Allocate; - PFREE_ROUTINE Free; - PFILE_READ_ROUTINE FileRead; - PFILE_WRITE_ROUTINE FileWrite; - PFILE_SET_SIZE_ROUTINE FileSetSize; - PFILE_FLUSH_ROUTINE FileFlush; - PHBASE_BLOCK HiveHeader; - RTL_BITMAP DirtyVector; - ULONG DirtyCount; - ULONG DirtyAlloc; - ULONG BaseBlockAlloc; - ULONG Cluster; - BOOLEAN Flat; - BOOLEAN ReadOnly; - BOOLEAN Log; - BOOLEAN DirtyFlag; - ULONG HvBinHeadersUse; - ULONG HvFreeCellsUse; - ULONG HvUsedcellsUse; - ULONG CmUsedCellsUse; - ULONG HiveFlags; - ULONG LogSize; - ULONG RefreshCount; - ULONG StorageTypeCount; - ULONG Version; - DUAL Storage[HvMaxStorageType]; -} HHIVE, *PHHIVE; - -#ifndef _CM_ -typedef struct _EREGISTRY_HIVE + USHORT Next; + USHORT Size; + CM_USE_COUNT_LOG_ENTRY Log[32]; +} CM_USE_COUNT_LOG, *PCM_USE_COUNT_LOG; + +// +// Configuration Manager Hive Structure +// +typedef struct _CMHIVE { - HHIVE Hive; - LIST_ENTRY HiveList; - UNICODE_STRING HiveFileName; - UNICODE_STRING LogFileName; - PCM_KEY_SECURITY RootSecurityCell; - ULONG Flags; - HANDLE HiveHandle; - HANDLE LogHandle; -} EREGISTRY_HIVE, *PEREGISTRY_HIVE; + HHIVE Hive; + HANDLE FileHandles[3]; + LIST_ENTRY NotifyList; + LIST_ENTRY HiveList; + EX_PUSH_LOCK HiveLock; + PKTHREAD HiveLockOwner; + PKGUARDED_MUTEX ViewLock; + PKTHREAD ViewLockOwner; + EX_PUSH_LOCK WriterLock; + PKTHREAD WriterLockOwner; + PERESOURCE FlusherLock; + EX_PUSH_LOCK SecurityLock; + PKTHREAD HiveSecurityLockOwner; + LIST_ENTRY LRUViewListHead; + LIST_ENTRY PinViewListHead; + PFILE_OBJECT FileObject; + UNICODE_STRING FileFullPath; + UNICODE_STRING FileUserName; + USHORT MappedViews; + USHORT PinnedViews; + ULONG UseCount; + ULONG SecurityCount; + ULONG SecurityCacheSize; + LONG SecurityHitHint; + PCM_KEY_SECURITY_CACHE_ENTRY SecurityCache; + LIST_ENTRY SecurityHash[CMP_SECURITY_HASH_LISTS]; + PKEVENT UnloadEvent; + PCM_KEY_CONTROL_BLOCK RootKcb; + BOOLEAN Frozen; + PWORK_QUEUE_ITEM UnloadWorkItem; + BOOLEAN GrowOnlyMode; + ULONG GrowOffset; + LIST_ENTRY KcbConvertListHead; + LIST_ENTRY KnodeConvertListHead; + PCM_CELL_REMAP_BLOCK CellRemapArray; + CM_USE_COUNT_LOG UseCountLog; + CM_USE_COUNT_LOG LockHiveLog; + ULONG Flags; + LIST_ENTRY TrustClassEntry; + ULONG FlushCount; + BOOLEAN HiveIsLoading; + PKTHREAD CreatorOwner; +} CMHIVE, *PCMHIVE; + #endif +extern ULONG CmlibTraceLevel; + /* * Public functions. */ - -#define HV_OPERATION_CREATE_HIVE 0 -#define HV_OPERATION_MEMORY 1 -#define HV_OPERATION_MEMORY_INPLACE 3 - NTSTATUS CMAPI HvInitialize( - PHHIVE RegistryHive, + PHHIVE RegistryHive, ULONG Operation, ULONG HiveType, ULONG HiveFlags, - ULONG_PTR HiveData OPTIONAL, - ULONG Cluster OPTIONAL, + PVOID HiveData OPTIONAL, PALLOCATE_ROUTINE Allocate, PFREE_ROUTINE Free, - PFILE_READ_ROUTINE FileRead, - PFILE_WRITE_ROUTINE FileWrite, PFILE_SET_SIZE_ROUTINE FileSetSize, + PFILE_WRITE_ROUTINE FileWrite, + PFILE_READ_ROUTINE FileRead, PFILE_FLUSH_ROUTINE FileFlush, - IN PUNICODE_STRING FileName); + ULONG Cluster OPTIONAL, + PUNICODE_STRING FileName); -VOID CMAPI +VOID CMAPI HvFree( PHHIVE RegistryHive); @@ -234,7 +241,8 @@ HCELL_INDEX CMAPI HvAllocateCell( PHHIVE RegistryHive, SIZE_T Size, - HV_STORAGE_TYPE Storage); + HSTORAGE_TYPE Storage, + IN HCELL_INDEX Vicinity); BOOLEAN CMAPI HvIsCellAllocated( @@ -253,10 +261,11 @@ HvFreeCell( PHHIVE RegistryHive, HCELL_INDEX CellOffset); -VOID CMAPI +BOOLEAN CMAPI HvMarkCellDirty( PHHIVE RegistryHive, - HCELL_INDEX CellOffset); + HCELL_INDEX CellOffset, + BOOLEAN HoldingLock); BOOLEAN CMAPI HvIsCellDirty( @@ -289,7 +298,7 @@ PHBIN CMAPI HvpAddBin( PHHIVE RegistryHive, ULONG Size, - HV_STORAGE_TYPE Storage); + HSTORAGE_TYPE Storage); NTSTATUS CMAPI HvpCreateHiveFreeCellList(