Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550/*++
Copyright (c) Microsoft Corporation
Module Name:
FxRegistryAPI.cpp
Abstract:
This module implements registry access in the framework
Author:
Environment:
Both kernel and user mode
Revision History:
--*/
#include "fxsupportpch.hpp"
extern "C" {// #include "FxRegistryAPI.tmh"#define RtlSizeTToULong RtlULongPtrToULong}
extern "C" {//// Not in a public header that we can reach, but is documented//NTSYSAPINTSTATUSNTAPIZwDeleteValueKey( __in IN HANDLE Key, __in IN PUNICODE_STRING ValueName );}
//// Extern "C" the entire file//extern "C" {
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryOpenKey)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in_opt WDFKEY ParentKey, __in PCUNICODE_STRING KeyName, __in ACCESS_MASK DesiredAccess, __in_opt PWDF_OBJECT_ATTRIBUTES KeyAttributes, __out WDFKEY* Key ){ DDI_ENTRY();
FxRegKey* pKey; PFX_DRIVER_GLOBALS pFxDriverGlobals; NTSTATUS status; WDFKEY keyHandle; HANDLE parentHandle;
pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals); keyHandle = NULL;
if (ParentKey != NULL) { FxRegKey* pParent;
FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals, ParentKey, FX_TYPE_REG_KEY, (PVOID*) &pParent, &pFxDriverGlobals);
parentHandle = pParent->GetHandle(); } else { parentHandle = NULL;
// // Get the parent's globals if it is present // if (NT_SUCCESS(FxValidateObjectAttributesForParentHandle(pFxDriverGlobals, KeyAttributes))) { FxObject* pParent;
FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals, KeyAttributes->ParentObject, FX_TYPE_OBJECT, (PVOID*)&pParent, &pFxDriverGlobals); } }
FxPointerNotNull(pFxDriverGlobals, KeyName); FxPointerNotNull(pFxDriverGlobals, Key);
*Key = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateObjectAttributes(pFxDriverGlobals, KeyAttributes); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, KeyName); if (!NT_SUCCESS(status)) { return status; }
pKey = new (pFxDriverGlobals, KeyAttributes) FxRegKey(pFxDriverGlobals); if (pKey == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Could not allocate memory for a WDFKEY, %!STATUS!", status);
return status; }
status = pKey->Commit(KeyAttributes, (WDFOBJECT*)&keyHandle);
if (NT_SUCCESS(status)) { status = pKey->Open(parentHandle, KeyName, DesiredAccess);
if (NT_SUCCESS(status)) { *Key = keyHandle; } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "new WDFKEY object open failed, %!STATUS!", status); } }
if (!NT_SUCCESS(status)) { pKey->DeleteFromFailedCreate(); pKey = NULL; }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryCreateKey)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in_opt WDFKEY ParentKey, __in PCUNICODE_STRING KeyName, __in ACCESS_MASK DesiredAccess, __in ULONG CreateOptions, __out_opt PULONG CreateDisposition, __in_opt PWDF_OBJECT_ATTRIBUTES KeyAttributes, __out WDFKEY* Key ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status; WDFKEY keyHandle; HANDLE parentHandle;
pFxDriverGlobals = GetFxDriverGlobals(DriverGlobals);
if (ParentKey != NULL) { FxRegKey* pParent;
FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals, ParentKey, FX_TYPE_REG_KEY, (PVOID*) &pParent, &pFxDriverGlobals);
parentHandle = pParent->GetHandle(); } else { parentHandle = NULL;
// // Get the parent's globals if it is present // if (NT_SUCCESS(FxValidateObjectAttributesForParentHandle(pFxDriverGlobals, KeyAttributes))) { FxObject* pParent;
FxObjectHandleGetPtrAndGlobals(pFxDriverGlobals, KeyAttributes->ParentObject, FX_TYPE_OBJECT, (PVOID*)&pParent, &pFxDriverGlobals); } }
FxPointerNotNull(pFxDriverGlobals, KeyName); FxPointerNotNull(pFxDriverGlobals, Key);
*Key = NULL; keyHandle = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateObjectAttributes(pFxDriverGlobals, KeyAttributes); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, KeyName); if (!NT_SUCCESS(status)) { return status; }
pKey = new (pFxDriverGlobals, KeyAttributes) FxRegKey(pFxDriverGlobals);
if (pKey == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Could not allocate memory for WDFKEY, %!STATUS!", status);
return status; }
status = pKey->Commit(KeyAttributes, (WDFOBJECT*)&keyHandle);
if (NT_SUCCESS(status)) { status = pKey->Create(parentHandle, KeyName, DesiredAccess, CreateOptions, CreateDisposition);
if (NT_SUCCESS(status)) { *Key = keyHandle; } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "Registry key creation failed, %!STATUS!", status); } }
if (!NT_SUCCESS(status)) { pKey->DeleteFromFailedCreate(); pKey = NULL; }
return status;}
__drv_maxIRQL(PASSIVE_LEVEL)VOIDNTAPIWDFEXPORT(WdfRegistryClose)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { FxVerifierDbgBreakPoint(pFxDriverGlobals); return; }
pKey->Close();
pKey->DeleteObject();}
__drv_maxIRQL(PASSIVE_LEVEL)HANDLENTAPIWDFEXPORT(WdfRegistryWdmGetHandle)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key ){ DDI_ENTRY();
FxRegKey* pKey;
FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey);
return pKey->GetHandle();}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryRemoveKey)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = Mx::MxDeleteKey(pKey->GetHandle());
if (NT_SUCCESS(status)) { // // pKey->GetHandle() is now useless, delete the Fx object // pKey->DeleteObject(); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryRemoveValue)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxPointerNotNull(pFxDriverGlobals, ValueName);
status = ZwDeleteValueKey(pKey->GetHandle(), (PUNICODE_STRING) ValueName);
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryValue)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in ULONG ValueLength, __out_bcount_opt( ValueLength) PVOID Value, __out_opt PULONG ValueLengthQueried, __out_opt PULONG ValueType ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
status = FxRegKey::_QueryValue(pFxDriverGlobals, pKey->GetHandle(), ValueName, ValueLength, Value, ValueLengthQueried, ValueType); if (!NT_SUCCESS(status)) { UCHAR traceLevel = TRACE_LEVEL_ERROR;
// // Label message as Verbose if this is the known pattern of // passing a 0-length NULL buffer to query the required buffer size. // if (status == STATUS_BUFFER_OVERFLOW && Value == NULL && ValueLength == 0) { traceLevel = TRACE_LEVEL_VERBOSE; }
DoTraceLevelMessage(pFxDriverGlobals, traceLevel, TRACINGERROR, "WDFKEY %p QueryValue failed, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryMemory)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in __drv_strictTypeMatch( 1) POOL_TYPE PoolType, __in_opt PWDF_OBJECT_ATTRIBUTES MemoryAttributes, __out WDFMEMORY* Memory, __out_opt PULONG ValueType ){ DDI_ENTRY();
FxRegKey* pKey; PFX_DRIVER_GLOBALS pFxDriverGlobals; NTSTATUS status; ULONG dataLength; PVOID dataBuffer;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, Memory);
*Memory = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
FxVerifierCheckNxPoolType(pFxDriverGlobals, PoolType, pFxDriverGlobals->Tag);
status = FxValidateObjectAttributes(pFxDriverGlobals, MemoryAttributes); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
// // Query the buffer length required. // status = pKey->QueryValue(ValueName, 0, NULL, &dataLength, NULL); if (!NT_SUCCESS(status) && status != STATUS_BUFFER_OVERFLOW) { return status; }
dataBuffer = FxPoolAllocate(pFxDriverGlobals, PagedPool, dataLength); if (dataBuffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p KEY_VALUE_PARTIAL_INFORMATION allocation failed, %!STATUS!", Key, status);
return status; }
status = pKey->QueryValue(ValueName, dataLength, dataBuffer, &dataLength, ValueType); if (NT_SUCCESS(status)) { FxMemoryObject* pObject;
status = FxMemoryObject::_Create(pFxDriverGlobals, MemoryAttributes, PoolType, pFxDriverGlobals->Tag, dataLength, &pObject);
if (NT_SUCCESS(status)) { status = pObject->Commit(MemoryAttributes, (WDFOBJECT*) Memory);
if (NT_SUCCESS(status)) { RtlCopyMemory(pObject->GetBuffer(), dataBuffer, dataLength); } else { pObject->DeleteFromFailedCreate(); } } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p WDFMEMORY object create failed, %!STATUS!", Key, status); } } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p QueryPartial failed, %!STATUS!", Key, status); }
FxPoolFree(dataBuffer);
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryMultiString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in_opt PWDF_OBJECT_ATTRIBUTES StringsAttributes, __in WDFCOLLECTION Collection ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxDeviceBase* pDeviceBase; FxCollection* pCollection; FxRegKey* pKey; NTSTATUS status; ULONG dataLength, type; PVOID dataBuffer;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
pDeviceBase = NULL;
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, Collection);
status = FxValidateObjectAttributes(pFxDriverGlobals, StringsAttributes); if (!NT_SUCCESS(status)) { return status; }
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxObjectHandleGetPtr(pFxDriverGlobals, Collection, FX_TYPE_COLLECTION, (PVOID*) &pCollection);
pDeviceBase = FxDeviceBase::_SearchForDevice(pFxDriverGlobals, StringsAttributes);
status = pKey->QueryValue(ValueName, 0, NULL, &dataLength, &type); if (!NT_SUCCESS(status) && status != STATUS_BUFFER_OVERFLOW) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p QueryPartial failed: %!STATUS!", Key, status);
return status; }
if (type != REG_MULTI_SZ) { return STATUS_OBJECT_TYPE_MISMATCH; }
dataBuffer = FxPoolAllocate(pFxDriverGlobals, PagedPool, dataLength); if (dataBuffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p KEY_VALUE_PARTIAL_INFORMATION allocation failed, %!STATUS!", Key, status);
return status; }
status = pKey->QueryValue(ValueName, dataLength, dataBuffer, &dataLength, &type); if (NT_SUCCESS(status)) { // // Verify that the data from the registry is a valid multi-sz string. // status = FxRegKey::_VerifyMultiSzString(pFxDriverGlobals, ValueName, (PWCHAR) dataBuffer, dataLength); }
if (NT_SUCCESS(status)) { ULONG initialCount; PWCHAR pCur;
initialCount = pCollection->Count(); pCur = (PWCHAR) dataBuffer;
while (*pCur != UNICODE_NULL) { FxString* pString;
pString = new (pFxDriverGlobals, StringsAttributes) FxString(pFxDriverGlobals);
if (pString != NULL) { if (pDeviceBase != NULL) { pString->SetDeviceBase(pDeviceBase); }
status = pString->Assign(pCur);
if (NT_SUCCESS(status)) { WDFOBJECT dummy;
status = pString->Commit(StringsAttributes, &dummy); }
if (NT_SUCCESS(status)) { if (pCollection->Add(pString) == FALSE) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, WDFCOLLECTION %p, collection add failed " "%!STATUS!", Key, Collection, status); } }
if (!NT_SUCCESS(status)) { // // Delete the string we just created // pString->DeleteFromFailedCreate(); } else { // // NT_SUCCES(status) // // Either the caller is responsible for freeing the // WDFSTRING or it has been parented to another object. // DO_NOTHING(); } } else { status = STATUS_INSUFFICIENT_RESOURCES; }
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p: WDFSTRING creation failed: %!STATUS!", Key, status); break; }
// // Increment to the next string in the multi sz (length of string + // 1 for the NULL) // pCur += wcslen(pCur) + 1; }
if (!NT_SUCCESS(status)) { // // Clear out all the items we added to the collection // while (pCollection->Count() > initialCount) { pCollection->Remove(initialCount); } } }
FxPoolFree(dataBuffer);
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryUnicodeString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __out_opt PUSHORT ValueByteLength, __inout_opt PUNICODE_STRING Value ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status; ULONG dataLength, type; PVOID dataBuffer;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
if (Value != NULL) { status = FxValidateUnicodeString(pFxDriverGlobals, Value); if (!NT_SUCCESS(status)) { return status; } }
if (Value == NULL) { // // Caller wants to know just the length // dataLength = 0; dataBuffer = NULL; } else { dataLength = Value->MaximumLength; dataBuffer = FxPoolAllocate(pFxDriverGlobals, PagedPool, dataLength);
if (dataBuffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p KEY_VALUE_PARTIAL_INFORMATION allocation failed, " "%!STATUS!", Key, status);
return status; } }
status = pKey->QueryValue(ValueName, dataLength, dataBuffer, &dataLength, &type); if (NT_SUCCESS(status) && FxRegKey::_IsValidSzType(type) == FALSE) { status = STATUS_OBJECT_TYPE_MISMATCH; }
// // Set ValueByteLength before doing the copy // if (NT_SUCCESS(status) || status == STATUS_BUFFER_OVERFLOW) { // // pPartial->DataLength is in bytes, convert to number of // WCHARs // if (ValueByteLength != NULL) { *ValueByteLength = (USHORT)dataLength ; } }
if (NT_SUCCESS(status) && Value != NULL) {
ASSERT(ValueByteLength == NULL || *ValueByteLength >= dataLength);
// // pPartial->DataLength cannot be greater than Value->MaximumLength // based on the call to _ComputePartialSize above. So it is safe to // copy the pPartial data buffer to the Value buffer. // __analysis_assume(dataLength <= Value->MaximumLength); RtlCopyMemory(Value->Buffer, dataBuffer, dataLength);
//terminating null shouldn't be included in the Length Value->Length = (USHORT)dataLength;
if (Value->Buffer[Value->Length/sizeof(WCHAR)-1] == UNICODE_NULL) { Value->Length -= sizeof(WCHAR); } }
if (dataBuffer != NULL) { FxPoolFree(dataBuffer); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in WDFSTRING String ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxString* pString; FxRegKey* pKey; NTSTATUS status; ULONG dataLength, type; PVOID dataBuffer;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, String);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxObjectHandleGetPtr(pFxDriverGlobals, String, FX_TYPE_STRING, (PVOID*) &pString);
status = pKey->QueryValue(ValueName, 0, NULL, &dataLength, &type); if (NT_SUCCESS(status) && FxRegKey::_IsValidSzType(type) == FALSE) { status = STATUS_OBJECT_TYPE_MISMATCH; }
if (!NT_SUCCESS(status) && status != STATUS_BUFFER_OVERFLOW) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, QueryPartial failed, %!STATUS!", Key, status); return status; }
dataBuffer = FxPoolAllocate(pFxDriverGlobals, PagedPool, dataLength); if (dataBuffer == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p KEY_VALUE_PARTIAL_INFORMATION allocation failed, " "%!STATUS!", Key, status);
return status; }
status = pKey->QueryValue(ValueName, dataLength, dataBuffer, &dataLength, &type); if (NT_SUCCESS(status) && FxRegKey::_IsValidSzType(type) == FALSE) { status = STATUS_OBJECT_TYPE_MISMATCH; }
if (NT_SUCCESS(status)) { if (dataLength <= USHORT_MAX) { UNICODE_STRING tmp;
if (dataLength == 0x0) { // // Empty string // tmp.Buffer = L""; tmp.Length = 0; tmp.MaximumLength = 0; } else {
// // The string we read may not be NULL terminated, so put it into a // UNICODE_STRING. If the final character is NULL, shorten the // length of the string so that it does not include for the NULL. // // If there are embedded NULLs in the string previous to the final // character, we leave them in place. // tmp.Buffer = (PWCHAR) dataBuffer; tmp.Length = (USHORT) dataLength; tmp.MaximumLength = tmp.Length;
if (tmp.Buffer[(tmp.Length/sizeof(WCHAR))-1] == UNICODE_NULL) { // // Do not include the UNICODE_NULL in the length // tmp.Length -= sizeof(WCHAR); } }
status = pString->Assign(&tmp); } else { status = STATUS_INVALID_BUFFER_SIZE;
DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p QueryPartial failed, Length %d > max %d, %!STATUS!", Key, dataLength, USHORT_MAX, status); } } else { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p QueryPartial failed, Length %d, %!STATUS!", Key, dataLength, status); }
FxPoolFree(dataBuffer);
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryQueryULong)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __out PULONG Value ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, Value);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
status = FxRegKey::_QueryULong(pKey->GetHandle(), ValueName, Value);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, QueryULong, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignValue)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in ULONG ValueType, __in ULONG ValueLength, __in_ecount( ValueLength) PVOID Value ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
status = pKey->SetValue(ValueName, ValueType, Value, ValueLength);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p SetValue, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignMemory)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in ULONG ValueType, __in WDFMEMORY Memory, __in_opt PWDFMEMORY_OFFSET MemoryOffsets ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; IFxMemory* pMemory; FxRegKey* pKey; PVOID pBuffer; ULONG length; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, Memory);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxObjectHandleGetPtr(pFxDriverGlobals, Memory, IFX_TYPE_MEMORY, (PVOID*) &pMemory);
pBuffer = pMemory->GetBuffer(); length = (ULONG) pMemory->GetBufferSize();
if (MemoryOffsets != NULL) { status = pMemory->ValidateMemoryOffsets(MemoryOffsets);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, WDFMEMORY %p Offsets overflowed, %!STATUS!", Key, Memory, status);
return status; }
if (MemoryOffsets->BufferLength > 0) { status = RtlSizeTToULong(MemoryOffsets->BufferLength, &length);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, WDFMEMORY %p BufferLength in Offsets truncated, " "%!STATUS!", Key, Memory, status);
return status; } }
pBuffer = WDF_PTR_ADD_OFFSET(pBuffer, MemoryOffsets->BufferOffset); }
status = pKey->SetValue(ValueName, ValueType, pBuffer, length);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY handle %p SetValue, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignULong)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in ULONG Value ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
status = pKey->SetValue(ValueName, REG_DWORD, &Value, sizeof(Value));
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p SetValue, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignUnicodeString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in PCUNICODE_STRING Value ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxRegKey* pKey; NTSTATUS status; PWCHAR tempValueBuf; ULONG length;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, Value);
tempValueBuf = NULL;
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, Value); if (!NT_SUCCESS(status)) { return status; }
length = Value->Length + sizeof(UNICODE_NULL);
// // Buffer must be NULL terminated and Length of the buffer must also include the NULL // Allocate a temporary buffer and NULL terminate it. // tempValueBuf = (PWCHAR) FxPoolAllocate(pFxDriverGlobals, PagedPool, length);
if (tempValueBuf == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p allocate temporary buffer failed, " "%!STATUS!", Key, status);
return status; }
// // Copy over the string from the callers buffer and make sure it is // NULL terminated. // RtlCopyMemory(tempValueBuf, Value->Buffer, Value->Length); tempValueBuf[Value->Length/sizeof(WCHAR)] = UNICODE_NULL;
status = pKey->SetValue(ValueName, REG_SZ, tempValueBuf, length);
FxPoolFree(tempValueBuf);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p set value failed, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in WDFSTRING String ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxString* pString; FxRegKey* pKey; NTSTATUS status;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, String);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxObjectHandleGetPtr(pFxDriverGlobals, String, FX_TYPE_STRING, (PVOID*) &pString);
status = pKey->SetValue(ValueName, REG_SZ, pString->Buffer(), pString->ByteLength(TRUE));
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY handle %p SetValue, %!STATUS!", Key, status); }
return status;}
_Must_inspect_result___drv_maxIRQL(PASSIVE_LEVEL)NTSTATUSNTAPIWDFEXPORT(WdfRegistryAssignMultiString)( __in PWDF_DRIVER_GLOBALS DriverGlobals, __in WDFKEY Key, __in PCUNICODE_STRING ValueName, __in WDFCOLLECTION StringsCollection ){ DDI_ENTRY();
PFX_DRIVER_GLOBALS pFxDriverGlobals; FxCollection* pCollection; FxRegKey* pKey; PWCHAR pValue; NTSTATUS status; ULONG length; BOOLEAN valid;
FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals), Key, FX_TYPE_REG_KEY, (PVOID*) &pKey, &pFxDriverGlobals);
FxPointerNotNull(pFxDriverGlobals, ValueName); FxPointerNotNull(pFxDriverGlobals, StringsCollection);
status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL); if (!NT_SUCCESS(status)) { return status; }
status = FxValidateUnicodeString(pFxDriverGlobals, ValueName); if (!NT_SUCCESS(status)) { return status; }
FxObjectHandleGetPtr(pFxDriverGlobals, StringsCollection, FX_TYPE_COLLECTION, (PVOID *) &pCollection);
valid = FALSE;
status = RtlSizeTToULong( FxCalculateTotalStringSize(pCollection, TRUE, &valid), &length);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFCOLLECTION %p, collection too large to fit into " "a ULONG, %!STATUS!", StringsCollection, status); return status; }
if (valid == FALSE) { status = STATUS_INVALID_PARAMETER; DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p, WDFCOLLECTION %p contains " "non string objects, %!STATUS!", Key, StringsCollection, status); return status; }
pValue = (PWCHAR) FxPoolAllocate(pFxDriverGlobals, PagedPool, length);
if (pValue == NULL) { status = STATUS_INSUFFICIENT_RESOURCES;
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p allocate for query buffer failed, " "%!STATUS!", Key, status);
return status; }
FxCopyMultiSz(pValue, pCollection);
status = pKey->SetValue(ValueName, REG_MULTI_SZ, pValue, length);
if (!NT_SUCCESS(status)) { DoTraceLevelMessage( pFxDriverGlobals, TRACE_LEVEL_ERROR, TRACINGERROR, "WDFKEY %p SetValue, %!STATUS!", Key, status); }
FxPoolFree(pValue);
return status;}
} // extern "C"