fsrtlpc.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
00054
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
00066
00067
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 ,
00079
_OLE_,
00080
_OLE_,
00081
_OLE_,
00082
_OLE_,
00083
_OLE_,
00084
_OLE_,
00085
_OLE_,
00086
_OLE_,
00087
_OLE_,
00088
_OLE_,
00089
_OLE_,
00090
_OLE_,
00091
_OLE_,
00092
_OLE_,
00093
_OLE_,
00094
_OLE_,
00095
_OLE_,
00096
_OLE_,
00097
_OLE_,
00098
_OLE_,
00099
_OLE_,
00100
_OLE_,
00101
_OLE_,
00102
_OLE_,
00103
_OLE_,
00104
_OLE_,
00105
_OLE_,
00106
_OLE_,
00107
_OLE_,
00108
_OLE_,
00109
_OLE_,
00110
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00111
_FAT_ |
_HPFS_ |
_NTFS_ ,
00112
_WILD_|
_OLE_,
00113
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00114
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00115
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00116
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00117
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00118
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00119
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00120
_WILD_|
_OLE_,
00121
_HPFS_ |
_NTFS_ |
_OLE_,
00122
_HPFS_ |
_NTFS_ |
_OLE_,
00123
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00124
_FAT_ |
_HPFS_ |
_NTFS_ ,
00125 0 ,
00126
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00127
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00128
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00129
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00130
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00131
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00132
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00133
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00134
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00135
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00136
_NTFS_ ,
00137
_HPFS_ |
_NTFS_ |
_OLE_,
00138
_WILD_|
_OLE_,
00139
_HPFS_ |
_NTFS_ |
_OLE_,
00140
_WILD_|
_OLE_,
00141
_WILD_|
_OLE_,
00142
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00143
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00144
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00145
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00146
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00147
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00148
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00149
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00150
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00151
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00152
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00153
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00154
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00155
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00156
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00157
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00158
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00159
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00160
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00161
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00162
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00163
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00164
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00165
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00166
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00167
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00168
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00169
_HPFS_ |
_NTFS_ |
_OLE_,
00170 0 ,
00171
_HPFS_ |
_NTFS_ |
_OLE_,
00172
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00173
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00174
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00175
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00176
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00177
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00178
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00179
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00180
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00181
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00182
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00183
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00184
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00185
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00186
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00187
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00188
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00189
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00190
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00191
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00192
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00193
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00194
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00195
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00196
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00197
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00198
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00199
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00200
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00201
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00202 0 |
_OLE_,
00203
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00204
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00205
_FAT_ |
_HPFS_ |
_NTFS_ |
_OLE_,
00206 };
00207
00208 PUCHAR
FsRtlLegalAnsiCharacterArray = &
LocalLegalAnsiCharacterArray[0];
00209
00210
00211
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
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
00242
00243
00244
FsRtlInitializeTunnels();
00245
00246
00247
00248
00249
00250
FsRtlInitializeFileLocks();
00251
00252
00253
00254
00255
00256
FsRtlInitializeLargeMcbs();
00257
00258
00259
00260
00261
00262
KeInitializeSemaphore( &
FsRtlpUncSemaphore, 1, MAXLONG );
00263
00264
00265
00266
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
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
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310 {
00311
PAGED_CODE();
00312
00313
return &
FsRtlPagingIoResources[
FsRtlPagingIoResourceSelector++ %
00314
FSRTL_NUMBER_OF_RESOURCES];
00315 }
00316
00317
00318
00319
00320
00321
00322
NTSTATUS
00323 FsRtlGetCompatibilityModeValue (
00324 IN PUNICODE_STRING ValueName,
00325 IN OUT PULONG Value
00326 )
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345
00346
00347
00348
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
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
00434
00435
00436 DataPtr = (PULONG)
00437 ((PUCHAR)KeyValueInformation + KeyValueInformation->DataOffset);
00438 *Value = *DataPtr;
00439
00440 }
else {
00441
00442
00443
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
1.3.7