00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include "UdfProcs.h"
00023
00024
00025
00026
00027
00028 #define BugCheckFileId (UDFS_BUG_CHECK_FILEINFO)
00029
00030
00031
00032
00033
00034 #define Dbg (UDFS_DEBUG_LEVEL_FILEINFO)
00035
00036
00037
00038
00039
00040
INLINE
00041 ULONG
00042 UdfGetExtraFileAttributes (
00043 IN
PCCB Ccb
00044 )
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 {
00064
return ( Ccb->Lcb !=
NULL? Ccb->Lcb->FileAttributes : 0 );
00065 }
00066
00067
00068
00069
00070
00071
VOID
00072
UdfQueryBasicInfo (
00073 IN
PIRP_CONTEXT IrpContext,
00074 IN
PFCB Fcb,
00075 IN
PCCB Ccb,
00076 IN OUT PFILE_BASIC_INFORMATION Buffer,
00077 IN OUT PULONG Length
00078 );
00079
00080
VOID
00081
UdfQueryStandardInfo (
00082 IN
PIRP_CONTEXT IrpContext,
00083 IN
PFCB Fcb,
00084 IN OUT PFILE_STANDARD_INFORMATION Buffer,
00085 IN OUT PULONG Length
00086 );
00087
00088
VOID
00089
UdfQueryInternalInfo (
00090 IN
PIRP_CONTEXT IrpContext,
00091 IN
PFCB Fcb,
00092 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
00093 IN OUT PULONG Length
00094 );
00095
00096
VOID
00097
UdfQueryEaInfo (
00098 IN
PIRP_CONTEXT IrpContext,
00099 IN
PFCB Fcb,
00100 IN OUT PFILE_EA_INFORMATION Buffer,
00101 IN OUT PULONG Length
00102 );
00103
00104
VOID
00105
UdfQueryPositionInfo (
00106 IN
PIRP_CONTEXT IrpContext,
00107 IN
PFILE_OBJECT FileObject,
00108 IN OUT PFILE_POSITION_INFORMATION Buffer,
00109 IN OUT PULONG Length
00110 );
00111
00112
NTSTATUS
00113
UdfQueryNameInfo (
00114 IN
PIRP_CONTEXT IrpContext,
00115 IN
PFILE_OBJECT FileObject,
00116 IN OUT PFILE_NAME_INFORMATION Buffer,
00117 IN OUT PULONG Length
00118 );
00119
00120
NTSTATUS
00121
UdfQueryAlternateNameInfo (
00122 IN
PIRP_CONTEXT IrpContext,
00123 IN
PFCB Fcb,
00124 IN
PCCB Ccb,
00125 IN OUT PFILE_NAME_INFORMATION Buffer,
00126 IN OUT PULONG Length
00127 );
00128
00129
VOID
00130
UdfQueryNetworkInfo (
00131 IN
PIRP_CONTEXT IrpContext,
00132 IN
PFCB Fcb,
00133 IN
PCCB Ccb,
00134 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
00135 IN OUT PULONG Length
00136 );
00137
00138
#ifdef ALLOC_PRAGMA
00139
#pragma alloc_text(PAGE, UdfCommonQueryInfo)
00140
#pragma alloc_text(PAGE, UdfCommonSetInfo)
00141
#pragma alloc_text(PAGE, UdfFastQueryBasicInfo)
00142
#pragma alloc_text(PAGE, UdfFastQueryStdInfo)
00143
#pragma alloc_text(PAGE, UdfFastQueryNetworkInfo)
00144
#pragma alloc_text(PAGE, UdfQueryAlternateNameInfo)
00145
#pragma alloc_text(PAGE, UdfQueryBasicInfo)
00146
#pragma alloc_text(PAGE, UdfQueryEaInfo)
00147
#pragma alloc_text(PAGE, UdfQueryInternalInfo)
00148
#pragma alloc_text(PAGE, UdfQueryNameInfo)
00149
#pragma alloc_text(PAGE, UdfQueryNetworkInfo)
00150
#pragma alloc_text(PAGE, UdfQueryPositionInfo)
00151
#pragma alloc_text(PAGE, UdfQueryStandardInfo)
00152
#endif
00153
00154
00155
NTSTATUS
00156 UdfCommonQueryInfo (
00157 IN
PIRP_CONTEXT IrpContext,
00158 IN
PIRP Irp
00159 )
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178 {
00179
NTSTATUS Status = STATUS_SUCCESS;
00180
PIO_STACK_LOCATION IrpSp =
IoGetCurrentIrpStackLocation(
Irp );
00181
00182 ULONG Length;
00183 FILE_INFORMATION_CLASS FileInformationClass;
00184 PFILE_ALL_INFORMATION
Buffer;
00185
00186
TYPE_OF_OPEN TypeOfOpen;
00187
PFCB Fcb;
00188
PCCB Ccb;
00189
00190 BOOLEAN ReleaseFcb =
FALSE;
00191
00192
PAGED_CODE();
00193
00194
00195
00196
00197
00198 Length = IrpSp->
Parameters.QueryFile.Length;
00199 FileInformationClass = IrpSp->
Parameters.QueryFile.FileInformationClass;
00200
Buffer =
Irp->
AssociatedIrp.SystemBuffer;
00201
00202
00203
00204
00205
00206 TypeOfOpen =
UdfDecodeFileObject( IrpSp->
FileObject, &Fcb, &Ccb );
00207
00208
00209
00210
00211
00212
try {
00213
00214
00215
00216
00217
00218
switch (TypeOfOpen) {
00219
00220
case UserDirectoryOpen :
00221
case UserFileOpen :
00222
00223
00224
00225
00226
00227
UdfAcquireFileShared( IrpContext, Fcb );
00228 ReleaseFcb =
TRUE;
00229
00230
ASSERT(
FlagOn( Fcb->
FcbState,
FCB_STATE_INITIALIZED ));
00231
00232
00233
00234
00235
00236
00237
UdfVerifyFcbOperation( IrpContext, Fcb );
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
switch (FileInformationClass) {
00250
00251
case FileAllInformation:
00252
00253
00254
00255
00256
00257
if (
FlagOn( Ccb->
Flags,
CCB_FLAG_OPEN_BY_ID )) {
00258
00259
Status = STATUS_INVALID_PARAMETER;
00260
break;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269
00270 Length -= (
sizeof( FILE_ACCESS_INFORMATION ) +
00271
sizeof( FILE_MODE_INFORMATION ) +
00272
sizeof( FILE_ALIGNMENT_INFORMATION ));
00273
00274
UdfQueryBasicInfo( IrpContext, Fcb, Ccb, &
Buffer->BasicInformation, &Length );
00275
UdfQueryStandardInfo( IrpContext, Fcb, &
Buffer->StandardInformation, &Length );
00276
UdfQueryInternalInfo( IrpContext, Fcb, &
Buffer->InternalInformation, &Length );
00277
UdfQueryEaInfo( IrpContext, Fcb, &
Buffer->EaInformation, &Length );
00278
UdfQueryPositionInfo( IrpContext, IrpSp->
FileObject, &
Buffer->PositionInformation, &Length );
00279
Status =
UdfQueryNameInfo( IrpContext, IrpSp->
FileObject, &
Buffer->NameInformation, &Length );
00280
00281
break;
00282
00283
case FileBasicInformation:
00284
00285
UdfQueryBasicInfo( IrpContext, Fcb, Ccb, (PFILE_BASIC_INFORMATION)
Buffer, &Length );
00286
break;
00287
00288
case FileStandardInformation:
00289
00290
UdfQueryStandardInfo( IrpContext, Fcb, (PFILE_STANDARD_INFORMATION)
Buffer, &Length );
00291
break;
00292
00293
case FileInternalInformation:
00294
00295
UdfQueryInternalInfo( IrpContext, Fcb, (PFILE_INTERNAL_INFORMATION)
Buffer, &Length );
00296
break;
00297
00298
case FileEaInformation:
00299
00300
UdfQueryEaInfo( IrpContext, Fcb, (PFILE_EA_INFORMATION)
Buffer, &Length );
00301
break;
00302
00303
case FilePositionInformation:
00304
00305
UdfQueryPositionInfo( IrpContext, IrpSp->
FileObject, (PFILE_POSITION_INFORMATION)
Buffer, &Length );
00306
break;
00307
00308
case FileNameInformation:
00309
00310
00311
00312
00313
00314
if (!
FlagOn( Ccb->
Flags,
CCB_FLAG_OPEN_BY_ID )) {
00315
00316
Status =
UdfQueryNameInfo( IrpContext, IrpSp->
FileObject, (PFILE_NAME_INFORMATION)
Buffer, &Length );
00317
00318 }
else {
00319
00320
Status = STATUS_INVALID_PARAMETER;
00321 }
00322
00323
break;
00324
00325
case FileAlternateNameInformation:
00326
00327
if (!
FlagOn( Ccb->
Flags,
CCB_FLAG_OPEN_BY_ID )) {
00328
00329
Status =
UdfQueryAlternateNameInfo( IrpContext, Fcb, Ccb, (PFILE_NAME_INFORMATION)
Buffer, &Length );
00330
00331 }
else {
00332
00333
Status = STATUS_INVALID_PARAMETER;
00334 }
00335
00336
break;
00337
00338
case FileNetworkOpenInformation:
00339
00340
UdfQueryNetworkInfo( IrpContext, Fcb, Ccb, (PFILE_NETWORK_OPEN_INFORMATION)
Buffer, &Length );
00341
break;
00342
00343
default :
00344
00345
Status = STATUS_INVALID_PARAMETER;
00346 }
00347
00348
break;
00349
00350
default :
00351
00352
Status = STATUS_INVALID_PARAMETER;
00353 }
00354
00355
00356
00357
00358
00359
00360
Irp->
IoStatus.Information = IrpSp->
Parameters.QueryFile.Length - Length;
00361
00362 } finally {
00363
00364
00365
00366
00367
00368
if (ReleaseFcb) {
00369
00370
UdfReleaseFile( IrpContext, Fcb );
00371 }
00372 }
00373
00374
00375
00376
00377
00378
UdfCompleteRequest( IrpContext,
Irp,
Status );
00379
00380
return Status;
00381 }
00382
00383
00384
NTSTATUS
00385 UdfCommonSetInfo (
00386 IN
PIRP_CONTEXT IrpContext,
00387 IN
PIRP Irp
00388 )
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407 {
00408
NTSTATUS Status = STATUS_INVALID_PARAMETER;
00409
00410
TYPE_OF_OPEN TypeOfOpen;
00411
PFCB Fcb;
00412
PCCB Ccb;
00413
00414
PIO_STACK_LOCATION IrpSp =
IoGetCurrentIrpStackLocation(
Irp );
00415
00416 PFILE_POSITION_INFORMATION
Buffer;
00417
00418
PAGED_CODE();
00419
00420
00421
00422
00423
00424 TypeOfOpen =
UdfDecodeFileObject( IrpSp->
FileObject, &Fcb, &Ccb );
00425
00426
00427
00428
00429
00430
if ((TypeOfOpen !=
UserFileOpen) ||
00431 (IrpSp->
Parameters.QueryFile.FileInformationClass != FilePositionInformation)) {
00432
00433
UdfCompleteRequest( IrpContext,
Irp,
Status );
00434
return Status;
00435 }
00436
00437
00438
00439
00440
00441
UdfAcquireFileShared( IrpContext, Fcb );
00442
00443
try {
00444
00445
00446
00447
00448
00449
00450
UdfVerifyFcbOperation( IrpContext, Fcb );
00451
00452
Buffer =
Irp->
AssociatedIrp.SystemBuffer;
00453
00454
00455
00456
00457
00458
00459
00460
if (
FlagOn( IrpSp->
FileObject->
Flags,
FO_NO_INTERMEDIATE_BUFFERING ) &&
00461 ((
Buffer->CurrentByteOffset.LowPart & IrpSp->
DeviceObject->
AlignmentRequirement) != 0)) {
00462
00463
try_leave( NOTHING );
00464 }
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
UdfLockFcb( IrpContext, Fcb );
00476 IrpSp->
FileObject->
CurrentByteOffset =
Buffer->CurrentByteOffset;
00477
UdfUnlockFcb( IrpContext, Fcb );
00478
00479
Status = STATUS_SUCCESS;
00480
00481 } finally {
00482
00483
UdfReleaseFile( IrpContext, Fcb );
00484 }
00485
00486
00487
00488
00489
00490
UdfCompleteRequest( IrpContext,
Irp,
Status );
00491
return Status;
00492 }
00493
00494
00495 BOOLEAN
00496 UdfFastQueryBasicInfo (
00497 IN
PFILE_OBJECT FileObject,
00498 IN BOOLEAN Wait,
00499 IN OUT PFILE_BASIC_INFORMATION Buffer,
00500 OUT PIO_STATUS_BLOCK IoStatus,
00501 IN
PDEVICE_OBJECT DeviceObject
00502 )
00503
00504
00505
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527 {
00528 BOOLEAN Result =
FALSE;
00529
TYPE_OF_OPEN TypeOfOpen;
00530
00531
PFCB Fcb;
00532
PCCB Ccb;
00533
00534
PAGED_CODE();
00535
00536
ASSERT_FILE_OBJECT( FileObject );
00537
00538
FsRtlEnterFileSystem();
00539
00540
00541
00542
00543
00544
00545 TypeOfOpen =
UdfDecodeFileObject( FileObject, &Fcb, &Ccb );
00546
00547
00548
00549
00550
00551
ASSERT(
FlagOn( Fcb->
FcbState,
FCB_STATE_INITIALIZED ));
00552
00553
if (TypeOfOpen !=
UserFileOpen && TypeOfOpen !=
UserDirectoryOpen) {
00554
00555
FsRtlExitFileSystem();
00556
return FALSE;
00557 }
00558
00559
00560
00561
00562
00563
if (!
ExAcquireResourceShared( Fcb->Resource, Wait )) {
00564
00565
FsRtlExitFileSystem();
00566
return FALSE;
00567 }
00568
00569
00570
00571
00572
00573
try {
00574
00575
00576
00577
00578
00579
if (
UdfVerifyFcbOperation(
NULL, Fcb )) {
00580
00581
00582
00583
00584
00585
Buffer->CreationTime = Fcb->
Timestamps.
CreationTime;
00586
Buffer->LastWriteTime =
00587
Buffer->ChangeTime = Fcb->
Timestamps.
ModificationTime;
00588
Buffer->LastAccessTime = Fcb->
Timestamps.
AccessTime;
00589
00590
Buffer->FileAttributes = Fcb->
FileAttributes |
UdfGetExtraFileAttributes( Ccb );
00591
00592
00593
00594
00595
00596 IoStatus->Status = STATUS_SUCCESS;
00597 IoStatus->Information =
sizeof( FILE_BASIC_INFORMATION );
00598
00599 Result =
TRUE;
00600 }
00601
00602 } finally {
00603
00604
ExReleaseResource( Fcb->Resource );
00605
00606
FsRtlExitFileSystem();
00607 }
00608
00609
return Result;
00610 }
00611
00612
00613 BOOLEAN
00614 UdfFastQueryStdInfo (
00615 IN
PFILE_OBJECT FileObject,
00616 IN BOOLEAN Wait,
00617 IN OUT PFILE_STANDARD_INFORMATION Buffer,
00618 OUT PIO_STATUS_BLOCK IoStatus,
00619 IN
PDEVICE_OBJECT DeviceObject
00620 )
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645 {
00646 BOOLEAN Result =
FALSE;
00647
TYPE_OF_OPEN TypeOfOpen;
00648
00649
PFCB Fcb;
00650
00651
PAGED_CODE();
00652
00653
ASSERT_FILE_OBJECT( FileObject );
00654
00655
FsRtlEnterFileSystem();
00656
00657
00658
00659
00660
00661
00662 TypeOfOpen =
UdfFastDecodeFileObject( FileObject, &Fcb );
00663
00664
00665
00666
00667
00668
if (TypeOfOpen !=
UserFileOpen && TypeOfOpen !=
UserDirectoryOpen) {
00669
00670
FsRtlExitFileSystem();
00671
return FALSE;
00672 }
00673
00674
00675
00676
00677
00678
if (!
ExAcquireResourceShared( Fcb->Resource, Wait )) {
00679
00680
FsRtlExitFileSystem();
00681
return FALSE;
00682 }
00683
00684
00685
00686
00687
00688
try {
00689
00690
00691
00692
00693
00694
if (
UdfVerifyFcbOperation(
NULL, Fcb )) {
00695
00696
00697
00698
00699
00700
if (
FlagOn( Fcb->
FileAttributes, FILE_ATTRIBUTE_DIRECTORY )) {
00701
00702
Buffer->AllocationSize.QuadPart =
00703
Buffer->EndOfFile.QuadPart = 0;
00704
00705
Buffer->Directory =
TRUE;
00706
00707 }
else {
00708
00709
Buffer->AllocationSize.QuadPart = Fcb->AllocationSize.QuadPart;
00710
Buffer->EndOfFile.QuadPart = Fcb->FileSize.QuadPart;
00711
00712
Buffer->Directory =
FALSE;
00713 }
00714
00715
Buffer->NumberOfLinks = Fcb->
LinkCount;
00716
Buffer->DeletePending =
FALSE;
00717
00718
00719
00720
00721
00722 IoStatus->Status = STATUS_SUCCESS;
00723 IoStatus->Information =
sizeof( FILE_STANDARD_INFORMATION );
00724
00725 Result =
TRUE;
00726 }
00727
00728 } finally {
00729
00730
ExReleaseResource( Fcb->Resource );
00731
00732
FsRtlExitFileSystem();
00733 }
00734
00735
return Result;
00736 }
00737
00738
00739 BOOLEAN
00740 UdfFastQueryNetworkInfo (
00741 IN
PFILE_OBJECT FileObject,
00742 IN BOOLEAN Wait,
00743 OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
00744 OUT PIO_STATUS_BLOCK IoStatus,
00745 IN
PDEVICE_OBJECT DeviceObject
00746 )
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769
00770
00771 {
00772 BOOLEAN Result =
FALSE;
00773
TYPE_OF_OPEN TypeOfOpen;
00774
00775
PFCB Fcb;
00776
PCCB Ccb;
00777
00778
PAGED_CODE();
00779
00780
ASSERT_FILE_OBJECT( FileObject );
00781
00782
FsRtlEnterFileSystem();
00783
00784
00785
00786
00787
00788
00789 TypeOfOpen =
UdfDecodeFileObject( FileObject, &Fcb, &Ccb );
00790
00791
00792
00793
00794
00795
if (TypeOfOpen !=
UserFileOpen && TypeOfOpen !=
UserDirectoryOpen) {
00796
00797
FsRtlExitFileSystem();
00798
return FALSE;
00799 }
00800
00801
00802
00803
00804
00805
if (!
ExAcquireResourceShared( Fcb->Resource, Wait )) {
00806
00807
FsRtlExitFileSystem();
00808
return FALSE;
00809 }
00810
00811
00812
00813
00814
00815
try {
00816
00817
00818
00819
00820
00821
if (
UdfVerifyFcbOperation(
NULL, Fcb )) {
00822
00823
00824
00825
00826
00827
Buffer->CreationTime = Fcb->
Timestamps.
CreationTime;
00828
Buffer->LastWriteTime =
00829
Buffer->ChangeTime = Fcb->
Timestamps.
ModificationTime;
00830
Buffer->LastAccessTime = Fcb->
Timestamps.
AccessTime;
00831
00832
Buffer->FileAttributes = Fcb->
FileAttributes |
UdfGetExtraFileAttributes( Ccb );
00833
00834
00835
00836
00837
00838
if (
FlagOn( Fcb->
FileAttributes, FILE_ATTRIBUTE_DIRECTORY )) {
00839
00840
Buffer->AllocationSize.QuadPart =
00841
Buffer->EndOfFile.QuadPart = 0;
00842
00843 }
else {
00844
00845
Buffer->AllocationSize.QuadPart = Fcb->AllocationSize.QuadPart;
00846
Buffer->EndOfFile.QuadPart = Fcb->FileSize.QuadPart;
00847 }
00848
00849
00850
00851
00852
00853 IoStatus->Status = STATUS_SUCCESS;
00854 IoStatus->Information =
sizeof( FILE_NETWORK_OPEN_INFORMATION );
00855
00856 Result =
TRUE;
00857 }
00858
00859 } finally {
00860
00861
ExReleaseResource( Fcb->Resource );
00862
00863
FsRtlExitFileSystem();
00864 }
00865
00866
return Result;
00867 }
00868
00869
00870
00871
00872
00873
00874
VOID
00875 UdfQueryBasicInfo (
00876 IN
PIRP_CONTEXT IrpContext,
00877 IN
PFCB Fcb,
00878 IN
PCCB Ccb,
00879 IN OUT PFILE_BASIC_INFORMATION Buffer,
00880 IN OUT PULONG Length
00881 )
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907 {
00908
PAGED_CODE();
00909
00910
00911
00912
00913
00914
Buffer->CreationTime = Fcb->Timestamps.CreationTime;
00915
Buffer->LastWriteTime =
00916
Buffer->ChangeTime = Fcb->Timestamps.ModificationTime;
00917
Buffer->LastAccessTime = Fcb->Timestamps.AccessTime;
00918
00919
Buffer->FileAttributes = Fcb->FileAttributes |
UdfGetExtraFileAttributes( Ccb );
00920
00921
00922
00923
00924
00925 *Length -=
sizeof( FILE_BASIC_INFORMATION );
00926
00927
return;
00928 }
00929
00930
00931
00932
00933
00934
00935
VOID
00936 UdfQueryStandardInfo (
00937 IN
PIRP_CONTEXT IrpContext,
00938 IN
PFCB Fcb,
00939 IN OUT PFILE_STANDARD_INFORMATION Buffer,
00940 IN OUT PULONG Length
00941 )
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964 {
00965
PAGED_CODE();
00966
00967
00968
00969
00970
00971
Buffer->NumberOfLinks = Fcb->LinkCount;
00972
Buffer->DeletePending =
FALSE;
00973
00974
00975
00976
00977
00978
00979
if (
FlagOn( Fcb->FileAttributes, FILE_ATTRIBUTE_DIRECTORY )) {
00980
00981
Buffer->AllocationSize.QuadPart =
00982
Buffer->EndOfFile.QuadPart = 0;
00983
00984
Buffer->Directory =
TRUE;
00985
00986 }
else {
00987
00988
Buffer->AllocationSize.QuadPart = Fcb->AllocationSize.QuadPart;
00989
Buffer->EndOfFile.QuadPart = Fcb->FileSize.QuadPart;
00990
00991
Buffer->Directory =
FALSE;
00992 }
00993
00994
00995
00996
00997
00998 *Length -=
sizeof( FILE_STANDARD_INFORMATION );
00999
01000
return;
01001 }
01002
01003
01004
01005
01006
01007
01008
VOID
01009 UdfQueryInternalInfo (
01010 IN
PIRP_CONTEXT IrpContext,
01011 IN
PFCB Fcb,
01012 IN OUT PFILE_INTERNAL_INFORMATION Buffer,
01013 IN OUT PULONG Length
01014 )
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038 {
01039
PAGED_CODE();
01040
01041
01042
01043
01044
01045
Buffer->IndexNumber = Fcb->FileId;
01046 *Length -=
sizeof( FILE_INTERNAL_INFORMATION );
01047
01048
return;
01049 }
01050
01051
01052
01053
01054
01055
01056
VOID
01057 UdfQueryEaInfo (
01058 IN
PIRP_CONTEXT IrpContext,
01059 IN
PFCB Fcb,
01060 IN OUT PFILE_EA_INFORMATION Buffer,
01061 IN OUT PULONG Length
01062 )
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086 {
01087
PAGED_CODE();
01088
01089
01090
01091
01092
01093
Buffer->EaSize = 0;
01094 *Length -=
sizeof( FILE_EA_INFORMATION );
01095
01096
return;
01097 }
01098
01099
01100
01101
01102
01103
01104
VOID
01105 UdfQueryPositionInfo (
01106 IN
PIRP_CONTEXT IrpContext,
01107 IN
PFILE_OBJECT FileObject,
01108 IN OUT PFILE_POSITION_INFORMATION Buffer,
01109 IN OUT PULONG Length
01110 )
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134 {
01135
PAGED_CODE();
01136
01137
01138
01139
01140
01141
Buffer->CurrentByteOffset = FileObject->CurrentByteOffset;
01142
01143
01144
01145
01146
01147 *Length -=
sizeof( FILE_POSITION_INFORMATION );
01148
01149
return;
01150 }
01151
01152
01153
01154
01155
01156
01157
NTSTATUS
01158 UdfQueryNameInfo (
01159 IN
PIRP_CONTEXT IrpContext,
01160 IN
PFILE_OBJECT FileObject,
01161 IN OUT PFILE_NAME_INFORMATION Buffer,
01162 IN OUT PULONG Length
01163 )
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187 {
01188
NTSTATUS Status = STATUS_SUCCESS;
01189 ULONG LengthToCopy;
01190
01191
PAGED_CODE();
01192
01193
ASSERT(*Length >=
sizeof(ULONG));
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
Buffer->FileNameLength = LengthToCopy = FileObject->FileName.Length;
01205 *Length -=
sizeof(ULONG);
01206
01207
if (LengthToCopy > *Length) {
01208
01209 LengthToCopy = *Length;
01210
Status = STATUS_BUFFER_OVERFLOW;
01211 }
01212
01213 RtlCopyMemory(
Buffer->FileName, FileObject->FileName.Buffer, LengthToCopy );
01214
01215
01216
01217
01218
01219
01220
01221 *Length -= LengthToCopy;
01222
01223
return Status;
01224 }
01225
01226
01227
01228
01229
01230
01231
NTSTATUS
01232 UdfQueryAlternateNameInfo (
01233 IN
PIRP_CONTEXT IrpContext,
01234 IN
PFCB Fcb,
01235 IN
PCCB Ccb,
01236 IN OUT PFILE_NAME_INFORMATION Buffer,
01237 IN OUT PULONG Length
01238 )
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268 {
01269
NTSTATUS Status = STATUS_SUCCESS;
01270
01271
DIR_ENUM_CONTEXT DirContext;
01272
01273
PLCB Lcb;
01274
01275
PFCB ParentFcb;
01276 BOOLEAN ReleaseParentFcb =
FALSE;
01277
01278 BOOLEAN CleanupDirContext =
FALSE;
01279 BOOLEAN Result;
01280
01281 PUNICODE_STRING ShortName;
01282
01283 UNICODE_STRING LocalShortName;
01284 WCHAR LocalShortNameBuffer[
BYTE_COUNT_8_DOT_3 /
sizeof(WCHAR) ];
01285
01286
PAGED_CODE();
01287
01288
01289
01290
01291
01292
Buffer->FileNameLength = 0;
01293
01294
01295
01296
01297
01298 Lcb = Ccb->Lcb;
01299
01300
if (Lcb ==
NULL) {
01301
01302
return STATUS_OBJECT_NAME_NOT_FOUND;
01303 }
01304
01305
01306
01307
01308
01309
try {
01310
01311
if (
FlagOn( Lcb->
Flags,
LCB_FLAG_SHORT_NAME )) {
01312
01313
01314
01315
01316
01317 ShortName = &Lcb->
FileName;
01318
01319 }
else {
01320
01321
01322
01323
01324
01325
01326
if (
UdfIs8dot3Name( IrpContext, Lcb->
FileName )) {
01327
01328
try_leave(
Status = STATUS_OBJECT_NAME_NOT_FOUND );
01329 }
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339 ParentFcb = Lcb->
ParentFcb;
01340
UdfAcquireFileShared( IrpContext, ParentFcb );
01341 ReleaseParentFcb =
TRUE;
01342
01343
01344
01345
01346
01347
UdfInitializeDirContext( IrpContext, &DirContext );
01348 CleanupDirContext =
TRUE;
01349
01350 Result =
UdfFindDirEntry( IrpContext,
01351 ParentFcb,
01352 &Lcb->
FileName,
01353
BooleanFlagOn( Lcb->
Flags,
LCB_FLAG_IGNORE_CASE ),
01354
FALSE,
01355 &DirContext );
01356
01357
01358
01359
01360
01361
01362
ASSERT( Result );
01363
01364
if (!Result) {
01365
01366
try_leave(
Status = STATUS_OBJECT_NAME_NOT_FOUND );
01367 }
01368
01369
01370
01371
01372
01373 ShortName = &LocalShortName;
01374
01375 LocalShortName.Buffer = LocalShortNameBuffer;
01376 LocalShortName.Length = 0;
01377 LocalShortName.MaximumLength =
sizeof( LocalShortNameBuffer );
01378
01379
UdfGenerate8dot3Name( IrpContext,
01380 &DirContext.
CaseObjectName,
01381 ShortName );
01382 }
01383
01384
01385
01386
01387
01388
Buffer->FileNameLength = ShortName->Length;
01389
01390
if (
Buffer->FileNameLength +
sizeof( ULONG ) > *Length) {
01391
01392
Buffer->FileNameLength = *Length -
sizeof( ULONG );
01393
Status = STATUS_BUFFER_OVERFLOW;
01394 }
01395
01396 RtlCopyMemory(
Buffer->FileName, ShortName->Buffer,
Buffer->FileNameLength );
01397
01398 } finally {
01399
01400
if (CleanupDirContext) {
01401
01402
UdfCleanupDirContext( IrpContext, &DirContext );
01403 }
01404
01405
if (ReleaseParentFcb) {
01406
01407
UdfReleaseFile( IrpContext, ParentFcb );
01408 }
01409 }
01410
01411
01412
01413
01414
01415
if (
Status != STATUS_OBJECT_NAME_NOT_FOUND) {
01416
01417 *Length -=
sizeof( ULONG ) +
Buffer->FileNameLength;
01418 }
01419
01420
return Status;
01421 }
01422
01423
01424
01425
01426
01427
01428
VOID
01429 UdfQueryNetworkInfo (
01430 IN
PIRP_CONTEXT IrpContext,
01431 IN
PFCB Fcb,
01432 IN
PCCB Ccb,
01433 IN OUT PFILE_NETWORK_OPEN_INFORMATION Buffer,
01434 IN OUT PULONG Length
01435 )
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459 {
01460
PAGED_CODE();
01461
01462
01463
01464
01465
01466
Buffer->CreationTime = Fcb->Timestamps.CreationTime;
01467
Buffer->LastWriteTime =
01468
Buffer->ChangeTime = Fcb->Timestamps.ModificationTime;
01469
Buffer->LastAccessTime = Fcb->Timestamps.AccessTime;
01470
01471
Buffer->FileAttributes = Fcb->FileAttributes |
UdfGetExtraFileAttributes( Ccb );
01472
01473
01474
01475
01476
01477
01478
if (
FlagOn( Fcb->FileAttributes, FILE_ATTRIBUTE_DIRECTORY )) {
01479
01480
Buffer->AllocationSize.QuadPart =
01481
Buffer->EndOfFile.QuadPart = 0;
01482
01483 }
else {
01484
01485
Buffer->AllocationSize.QuadPart = Fcb->AllocationSize.QuadPart;
01486
Buffer->EndOfFile.QuadPart = Fcb->FileSize.QuadPart;
01487 }
01488
01489
01490
01491
01492
01493 *Length -=
sizeof( FILE_NETWORK_OPEN_INFORMATION );
01494
01495
return;
01496 }