Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

fsrtlpc.c

Go to the documentation of this file.
00001 /*++ 00002 00003 Copyright (c) 1989 Microsoft Corporation 00004 00005 Module Name: 00006 00007 FsRtlP.c 00008 00009 Abstract: 00010 00011 This module declares the global data used by the FsRtl Module 00012 00013 Author: 00014 00015 Gary Kimura [GaryKi] 30-Jul-1990 00016 00017 Revision History: 00018 00019 --*/ 00020 00021 #include "FsRtlP.h" 00022 00023 #define COMPATIBILITY_MODE_KEY_NAME L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\FileSystem" 00024 #define COMPATIBILITY_MODE_VALUE_NAME L"Win95TruncatedExtensions" 00025 00026 #define KEY_WORK_AREA ((sizeof(KEY_VALUE_FULL_INFORMATION) + \ 00027 sizeof(ULONG)) + 64) 00028 00029 #ifdef FSRTLDBG 00030 00031 LONG FsRtlDebugTraceLevel = 0x0000000f; 00032 LONG FsRtlDebugTraceIndent = 0; 00033 00034 #endif // FSRTLDBG 00035 00036 // 00037 // Local Support routine 00038 // 00039 00040 NTSTATUS 00041 FsRtlGetCompatibilityModeValue ( 00042 IN PUNICODE_STRING ValueName, 00043 IN OUT PULONG Value 00044 ); 00045 00046 #ifdef ALLOC_PRAGMA 00047 #pragma alloc_text(PAGE, FsRtlAllocateResource) 00048 #pragma alloc_text(INIT, FsRtlInitSystem) 00049 #pragma alloc_text(INIT, FsRtlGetCompatibilityModeValue) 00050 #endif 00051 00052 // 00053 // Define the number of resources, a pointer to them and a counter for 00054 // resource selection. 00055 // 00056 00057 #define FSRTL_NUMBER_OF_RESOURCES (16) 00058 00059 PERESOURCE FsRtlPagingIoResources; 00060 00061 ULONG FsRtlPagingIoResourceSelector = 0; 00062 BOOLEAN FsRtlSafeExtensions = TRUE; 00063 00064 // 00065 // The global static legal ANSI character array. Wild characters 00066 // are not considered legal, they should be checked seperately if 00067 // allowed. 00068 // 00069 00070 #define _FAT_ FSRTL_FAT_LEGAL 00071 #define _HPFS_ FSRTL_HPFS_LEGAL 00072 #define _NTFS_ FSRTL_NTFS_LEGAL 00073 #define _OLE_ FSRTL_OLE_LEGAL 00074 #define _WILD_ FSRTL_WILD_CHARACTER 00075 00076 static UCHAR LocalLegalAnsiCharacterArray[128] = { 00077 00078 0 , // 0x00 ^@ 00079 _OLE_, // 0x01 ^A 00080 _OLE_, // 0x02 ^B 00081 _OLE_, // 0x03 ^C 00082 _OLE_, // 0x04 ^D 00083 _OLE_, // 0x05 ^E 00084 _OLE_, // 0x06 ^F 00085 _OLE_, // 0x07 ^G 00086 _OLE_, // 0x08 ^H 00087 _OLE_, // 0x09 ^I 00088 _OLE_, // 0x0A ^J 00089 _OLE_, // 0x0B ^K 00090 _OLE_, // 0x0C ^L 00091 _OLE_, // 0x0D ^M 00092 _OLE_, // 0x0E ^N 00093 _OLE_, // 0x0F ^O 00094 _OLE_, // 0x10 ^P 00095 _OLE_, // 0x11 ^Q 00096 _OLE_, // 0x12 ^R 00097 _OLE_, // 0x13 ^S 00098 _OLE_, // 0x14 ^T 00099 _OLE_, // 0x15 ^U 00100 _OLE_, // 0x16 ^V 00101 _OLE_, // 0x17 ^W 00102 _OLE_, // 0x18 ^X 00103 _OLE_, // 0x19 ^Y 00104 _OLE_, // 0x1A ^Z 00105 _OLE_, // 0x1B ESC 00106 _OLE_, // 0x1C FS 00107 _OLE_, // 0x1D GS 00108 _OLE_, // 0x1E RS 00109 _OLE_, // 0x1F US 00110 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x20 space 00111 _FAT_ | _HPFS_ | _NTFS_ , // 0x21 ! 00112 _WILD_| _OLE_, // 0x22 " 00113 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x23 # 00114 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x24 $ 00115 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x25 % 00116 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x26 & 00117 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x27 ' 00118 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x28 ( 00119 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x29 ) 00120 _WILD_| _OLE_, // 0x2A * 00121 _HPFS_ | _NTFS_ | _OLE_, // 0x2B + 00122 _HPFS_ | _NTFS_ | _OLE_, // 0x2C , 00123 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x2D - 00124 _FAT_ | _HPFS_ | _NTFS_ , // 0x2E . 00125 0 , // 0x2F / 00126 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x30 0 00127 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x31 1 00128 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x32 2 00129 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x33 3 00130 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x34 4 00131 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x35 5 00132 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x36 6 00133 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x37 7 00134 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x38 8 00135 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x39 9 00136 _NTFS_ , // 0x3A : 00137 _HPFS_ | _NTFS_ | _OLE_, // 0x3B ; 00138 _WILD_| _OLE_, // 0x3C < 00139 _HPFS_ | _NTFS_ | _OLE_, // 0x3D = 00140 _WILD_| _OLE_, // 0x3E > 00141 _WILD_| _OLE_, // 0x3F ? 00142 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x40 @ 00143 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x41 A 00144 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x42 B 00145 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x43 C 00146 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x44 D 00147 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x45 E 00148 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x46 F 00149 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x47 G 00150 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x48 H 00151 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x49 I 00152 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4A J 00153 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4B K 00154 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4C L 00155 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4D M 00156 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4E N 00157 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x4F O 00158 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x50 P 00159 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x51 Q 00160 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x52 R 00161 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x53 S 00162 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x54 T 00163 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x55 U 00164 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x56 V 00165 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x57 W 00166 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x58 X 00167 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x59 Y 00168 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x5A Z 00169 _HPFS_ | _NTFS_ | _OLE_, // 0x5B [ 00170 0 , // 0x5C backslash 00171 _HPFS_ | _NTFS_ | _OLE_, // 0x5D ] 00172 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x5E ^ 00173 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x5F _ 00174 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x60 ` 00175 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x61 a 00176 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x62 b 00177 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x63 c 00178 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x64 d 00179 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x65 e 00180 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x66 f 00181 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x67 g 00182 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x68 h 00183 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x69 i 00184 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6A j 00185 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6B k 00186 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6C l 00187 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6D m 00188 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6E n 00189 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x6F o 00190 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x70 p 00191 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x71 q 00192 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x72 r 00193 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x73 s 00194 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x74 t 00195 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x75 u 00196 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x76 v 00197 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x77 w 00198 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x78 x 00199 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x79 y 00200 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x7A z 00201 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x7B { 00202 0 | _OLE_, // 0x7C | 00203 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x7D } 00204 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x7E ~ 00205 _FAT_ | _HPFS_ | _NTFS_ | _OLE_, // 0x7F  00206 }; 00207 00208 PUCHAR FsRtlLegalAnsiCharacterArray = &LocalLegalAnsiCharacterArray[0]; 00209 00210 // 00211 // This routine is called during phase one initialization. 00212 // 00213 00214 BOOLEAN 00215 FsRtlInitSystem ( 00216 ) 00217 { 00218 ULONG i; 00219 00220 ULONG Value; 00221 UNICODE_STRING ValueName; 00222 00223 extern KSEMAPHORE FsRtlpUncSemaphore; 00224 00225 PAGED_CODE(); 00226 00227 // 00228 // Allocate and initialize all the paging Io resources 00229 // 00230 00231 FsRtlPagingIoResources = FsRtlAllocatePool( NonPagedPool, 00232 FSRTL_NUMBER_OF_RESOURCES * 00233 sizeof(ERESOURCE) ); 00234 00235 for (i=0; i < FSRTL_NUMBER_OF_RESOURCES; i++) { 00236 00237 ExInitializeResource( &FsRtlPagingIoResources[i] ); 00238 } 00239 00240 // 00241 // Initialize the global tunneling structures. 00242 // 00243 00244 FsRtlInitializeTunnels(); 00245 00246 // 00247 // Initialize the global filelock structures. 00248 // 00249 00250 FsRtlInitializeFileLocks(); 00251 00252 // 00253 // Initialize the global largemcb structures. 00254 // 00255 00256 FsRtlInitializeLargeMcbs(); 00257 00258 // 00259 // Initialize the semaphore used to guard loading of the MUP 00260 // 00261 00262 KeInitializeSemaphore( &FsRtlpUncSemaphore, 1, MAXLONG ); 00263 00264 // 00265 // Pull the bit from the registry telling us whether to do a safe 00266 // or dangerous extension truncation. 00267 // 00268 00269 ValueName.Buffer = COMPATIBILITY_MODE_VALUE_NAME; 00270 ValueName.Length = sizeof(COMPATIBILITY_MODE_VALUE_NAME) - sizeof(WCHAR); 00271 ValueName.MaximumLength = sizeof(COMPATIBILITY_MODE_VALUE_NAME); 00272 00273 if (NT_SUCCESS(FsRtlGetCompatibilityModeValue( &ValueName, &Value )) && 00274 (Value != 0)) { 00275 00276 FsRtlSafeExtensions = FALSE; 00277 } 00278 00279 // 00280 // Initialize the FsRtl stack overflow work QueueObject and thread. 00281 // 00282 00283 if (!NT_SUCCESS(FsRtlInitializeWorkerThread())) { 00284 00285 return FALSE; 00286 } 00287 00288 return TRUE; 00289 } 00290 00291 00292 PERESOURCE 00293 FsRtlAllocateResource ( 00294 ) 00295 00296 /*++ 00297 00298 Routine Description: 00299 00300 This routine is used to allocate a resource from the FsRtl pool. 00301 00302 Arguments: 00303 00304 Return Value: 00305 00306 PERESOURCE - A pointer to the provided resource. 00307 00308 --*/ 00309 00310 { 00311 PAGED_CODE(); 00312 00313 return &FsRtlPagingIoResources[ FsRtlPagingIoResourceSelector++ % 00314 FSRTL_NUMBER_OF_RESOURCES]; 00315 } 00316 00317 00318 // 00319 // Local Support routine 00320 // 00321 00322 NTSTATUS 00323 FsRtlGetCompatibilityModeValue ( 00324 IN PUNICODE_STRING ValueName, 00325 IN OUT PULONG Value 00326 ) 00327 00328 /*++ 00329 00330 Routine Description: 00331 00332 Given a unicode value name this routine will go into the registry 00333 location for the Chicago compatibilitymode information and get the 00334 value. 00335 00336 Arguments: 00337 00338 ValueName - the unicode name for the registry value located in the 00339 double space configuration location of the registry. 00340 Value - a pointer to the ULONG for the result. 00341 00342 Return Value: 00343 00344 NTSTATUS 00345 00346 If STATUS_SUCCESSFUL is returned, the location *Value will be 00347 updated with the DWORD value from the registry. If any failing 00348 status is returned, this value is untouched. 00349 00350 --*/ 00351 00352 { 00353 HANDLE Handle; 00354 NTSTATUS Status; 00355 ULONG RequestLength; 00356 ULONG ResultLength; 00357 UCHAR Buffer[KEY_WORK_AREA]; 00358 UNICODE_STRING KeyName; 00359 OBJECT_ATTRIBUTES ObjectAttributes; 00360 PKEY_VALUE_FULL_INFORMATION KeyValueInformation; 00361 00362 KeyName.Buffer = COMPATIBILITY_MODE_KEY_NAME; 00363 KeyName.Length = sizeof(COMPATIBILITY_MODE_KEY_NAME) - sizeof(WCHAR); 00364 KeyName.MaximumLength = sizeof(COMPATIBILITY_MODE_KEY_NAME); 00365 00366 InitializeObjectAttributes(&ObjectAttributes, 00367 &KeyName, 00368 OBJ_CASE_INSENSITIVE, 00369 NULL, 00370 NULL); 00371 00372 Status = ZwOpenKey(&Handle, 00373 KEY_READ, 00374 &ObjectAttributes); 00375 00376 if (!NT_SUCCESS(Status)) { 00377 00378 return Status; 00379 } 00380 00381 RequestLength = KEY_WORK_AREA; 00382 00383 KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION)Buffer; 00384 00385 while (1) { 00386 00387 Status = ZwQueryValueKey(Handle, 00388 ValueName, 00389 KeyValueFullInformation, 00390 KeyValueInformation, 00391 RequestLength, 00392 &ResultLength); 00393 00394 ASSERT( Status != STATUS_BUFFER_OVERFLOW ); 00395 00396 if (Status == STATUS_BUFFER_OVERFLOW) { 00397 00398 // 00399 // Try to get a buffer big enough. 00400 // 00401 00402 if (KeyValueInformation != (PKEY_VALUE_FULL_INFORMATION)Buffer) { 00403 00404 ExFreePool(KeyValueInformation); 00405 } 00406 00407 RequestLength += 256; 00408 00409 KeyValueInformation = (PKEY_VALUE_FULL_INFORMATION) 00410 ExAllocatePoolWithTag(PagedPool, 00411 RequestLength, 00412 ' taF'); 00413 00414 if (!KeyValueInformation) { 00415 return STATUS_NO_MEMORY; 00416 } 00417 00418 } else { 00419 00420 break; 00421 } 00422 } 00423 00424 ZwClose(Handle); 00425 00426 if (NT_SUCCESS(Status)) { 00427 00428 if (KeyValueInformation->DataLength != 0) { 00429 00430 PULONG DataPtr; 00431 00432 // 00433 // Return contents to the caller. 00434 // 00435 00436 DataPtr = (PULONG) 00437 ((PUCHAR)KeyValueInformation + KeyValueInformation->DataOffset); 00438 *Value = *DataPtr; 00439 00440 } else { 00441 00442 // 00443 // Treat as if no value was found 00444 // 00445 00446 Status = STATUS_OBJECT_NAME_NOT_FOUND; 00447 } 00448 } 00449 00450 if (KeyValueInformation != (PKEY_VALUE_FULL_INFORMATION)Buffer) { 00451 00452 ExFreePool(KeyValueInformation); 00453 } 00454 00455 return Status; 00456 }

Generated on Sat May 15 19:40:04 2004 for test by doxygen 1.3.7