14 _In_ PUNICODE_STRING TestName,
15 _In_opt_ PUNICODE_STRING LongName
19 #pragma alloc_text(INIT, NcInitializeMapping) 20 #pragma alloc_text(INIT, NcLoadRegistryString) 21 #pragma alloc_text(INIT, NcIs8DOT3Compatible) 28 #pragma warning(disable:6001) 31 NcLoadRegistryString (
50 RtlInitUnicodeString( &ValueString, valueName );
52 NcLoadRegistryStringRetry:
53 Status = ZwQueryValueKey( Key,
58 &TempMappingKeyLength );
65 if (Status != STATUS_BUFFER_TOO_SMALL &&
66 Status != STATUS_BUFFER_OVERFLOW) {
68 goto NcLoadRegistryStringCleanup;
75 if (TempMappingBuffer !=
NULL) {
76 ExFreePoolWithTag( TempMappingBuffer,
NC_TAG );
79 TempMappingBuffer = ExAllocatePoolWithTag( PagedPool,
83 if (TempMappingBuffer ==
NULL) {
85 Status = STATUS_INSUFFICIENT_RESOURCES;
86 goto NcLoadRegistryStringCleanup;
93 Status = ZwQueryValueKey( Key,
98 &TempMappingKeyLength );
106 if (Status == STATUS_BUFFER_TOO_SMALL ||
107 Status == STATUS_BUFFER_OVERFLOW) {
109 goto NcLoadRegistryStringRetry;
112 if (!NT_SUCCESS( Status )) {
114 goto NcLoadRegistryStringCleanup;
124 if (TempMappingBuffer->Type != REG_SZ ||
125 TempMappingBuffer->DataLength >= MAXUSHORT ||
126 TempMappingBuffer->DataLength <=
sizeof(WCHAR)) {
128 Status = STATUS_INVALID_PARAMETER;
129 goto NcLoadRegistryStringCleanup;
138 OutputStringBuffer = ExAllocatePoolWithTag( NonPagedPool,
139 TempMappingBuffer->DataLength -
sizeof(WCHAR),
142 if (OutputStringBuffer ==
NULL) {
144 Status = STATUS_INSUFFICIENT_RESOURCES;
145 goto NcLoadRegistryStringCleanup;
153 Status = STATUS_SUCCESS;
155 OutputString->MaximumLength = (USHORT)TempMappingBuffer->DataLength -
sizeof(WCHAR);
158 RtlCopyMemory( OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength );
159 OutputString->Length = OutputString->MaximumLength;
165 OutputStringBuffer =
NULL;
167 NcLoadRegistryStringCleanup:
169 if (TempMappingBuffer !=
NULL) {
170 ExFreePoolWithTag( TempMappingBuffer,
NC_TAG );
173 if (OutputStringBuffer !=
NULL) {
174 ExFreePoolWithTag( OutputStringBuffer,
NC_TAG );
182 _In_ PUNICODE_STRING TestName,
183 _In_opt_ PUNICODE_STRING LongName
186 BOOLEAN SpacesPresent;
195 if (!RtlIsNameLegalDOS8Dot3( TestName,
237 Index < TestName->Length/
sizeof(WCHAR);
240 if (TestName->Buffer[Index] == L
'~' ||
241 TestName->Buffer[Index] == L
'\\' ||
242 TestName->Buffer[Index] != RtlUpcaseUnicodeChar( TestName->Buffer[Index] )) {
255 if (!ARGUMENT_PRESENT( LongName )) {
272 if (!RtlEqualUnicodeString( TestName, LongName, FALSE )) {
283 _In_ PUNICODE_STRING RegistryPath
304 OBJECT_ATTRIBUTES Attributes;
305 HANDLE DriverRegKey =
NULL;
317 InitializeObjectAttributes( &Attributes,
319 OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
323 Status = ZwOpenKey( &DriverRegKey,
327 if (!NT_SUCCESS( Status )) {
330 goto NcInitializeMappingCleanup;
333 Status = NcLoadRegistryString( DriverRegKey,
337 if (!NT_SUCCESS( Status )) {
338 goto NcInitializeMappingCleanup;
348 for (Index = 1; Index < TempPath.Length/
sizeof(WCHAR); Index++) {
350 if (TempPath.Buffer[Index] == L
'\\' &&
351 TempPath.Buffer[Index - 1] == L
'\\') {
353 Status = STATUS_INVALID_PARAMETER;
354 goto NcInitializeMappingCleanup;
363 if (!NT_SUCCESS( Status )) {
364 goto NcInitializeMappingCleanup;
369 Status = NcLoadRegistryString( DriverRegKey,
370 L
"UserMappingFinalComponentShort",
373 if (!NT_SUCCESS( Status )) {
374 goto NcInitializeMappingCleanup;
377 Status = NcLoadRegistryString( DriverRegKey,
381 if (!NT_SUCCESS( Status )) {
382 goto NcInitializeMappingCleanup;
392 for (Index = 1; Index < TempPath.Length/
sizeof(WCHAR); Index++) {
394 if (TempPath.Buffer[Index] == L
'\\' &&
395 TempPath.Buffer[Index - 1] == L
'\\') {
397 Status = STATUS_INVALID_PARAMETER;
398 goto NcInitializeMappingCleanup;
407 if (!NT_SUCCESS( Status )) {
408 goto NcInitializeMappingCleanup;
426 Status = STATUS_INVALID_PARAMETER;
427 goto NcInitializeMappingCleanup;
433 Status = STATUS_INVALID_PARAMETER;
434 goto NcInitializeMappingCleanup;
447 Status = STATUS_INVALID_PARAMETER;
448 goto NcInitializeMappingCleanup;
451 NcInitializeMappingCleanup:
454 if (!NT_SUCCESS( Status )) {
477 if (TempPath.Buffer !=
NULL) {
481 if (DriverRegKey !=
NULL) {
483 NTSTATUS BogusStatus;
485 BogusStatus = ZwClose( DriverRegKey );
#define EMPTY_UNICODE_STRING
UNICODE_STRING UserMappingFinalComponentLong
UNICODE_STRING UserMappingFinalComponentShort
BOOLEAN NcIs8DOT3Compatible(_In_ PUNICODE_STRING TestName, _In_opt_ PUNICODE_STRING LongName)
RtlCopyMemory(OutputStringBuffer, TempMappingBuffer->Data, OutputString->MaximumLength)
UNICODE_STRING UserMappingPath
FLT_ASSERT(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
#define NcFreeUnicodeString(UCS)
UNICODE_STRING ValueString
NcLoadRegistryStringRetry KeyValuePartialInformation
NTSTATUS NcParseFinalComponent(_In_ PUNICODE_STRING EntirePath, _Out_ PUNICODE_STRING ParentPath, _Out_ PUNICODE_STRING FinalComponent)
NTSTATUS NcInitializeMapping(_In_ PUNICODE_STRING RegistryPath)
NcLoadRegistryStringRetry NULL
PWCHAR OutputStringBuffer
NC_GLOBAL_DATA NcGlobalData
ULONG TempMappingKeyLength
NcLoadRegistryStringCleanup NC_TAG
_At_(OutputString->Buffer, _Post_notnull_) NTSTATUS NcLoadRegistryString(_In_ HANDLE Key
_In_ PCWSTR _Out_ PUNICODE_STRING OutputString
UNICODE_STRING RealMappingFinalComponent
UNICODE_STRING RealMappingPath