00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include "UdfProcs.h"
00022
00023
00024
00025
00026
00027 #define BugCheckFileId (UDFS_BUG_CHECK_FILOBSUP)
00028
00029
00030
00031
00032
00033 #define Dbg (UDFS_DEBUG_LEVEL_FILOBSUP)
00034
00035
00036
00037
00038
00039 #define TYPE_OF_OPEN_MASK (0x00000007)
00040
00041
#ifdef ALLOC_PRAGMA
00042
#pragma alloc_text(PAGE, UdfDecodeFileObject)
00043
#pragma alloc_text(PAGE, UdfFastDecodeFileObject)
00044
#pragma alloc_text(PAGE, UdfSetFileObject)
00045
#endif
00046
00047
00048
VOID
00049 UdfSetFileObject (
00050 IN
PIRP_CONTEXT IrpContext,
00051 IN
PFILE_OBJECT FileObject,
00052 IN TYPE_OF_OPEN TypeOfOpen,
00053 IN
PFCB Fcb OPTIONAL,
00054 IN
PCCB Ccb OPTIONAL
00055 )
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081 {
00082
PAGED_CODE();
00083
00084
00085
00086
00087
00088
00089
ASSERTMSG(
"FileObject types exceed available bits\n",
BeyondValidType <= 8 );
00090
00091
00092
00093
00094
00095
00096
if (TypeOfOpen ==
UnopenedFileObject) {
00097
00098 FileObject->FsContext =
00099 FileObject->FsContext2 =
NULL;
00100
00101
return;
00102 }
00103
00104
00105
00106
00107
00108
ASSERTMSG(
"Ccb is not quad-aligned\n", !
FlagOn( ((ULONG_PTR) Ccb),
TYPE_OF_OPEN_MASK ));
00109
00110
00111
00112
00113
00114
00115
00116 FileObject->FsContext = Fcb;
00117 FileObject->FsContext2 = Ccb;
00118
00119
SetFlag( ((ULONG_PTR) FileObject->FsContext2), TypeOfOpen );
00120
00121
00122
00123
00124
00125 FileObject->Vpb = Fcb->Vcb->Vpb;
00126
00127
return;
00128 }
00129
00130
00131
00132
TYPE_OF_OPEN
00133 UdfDecodeFileObject (
00134 IN
PFILE_OBJECT FileObject,
00135 OUT
PFCB *Fcb,
00136 OUT
PCCB *Ccb
00137 )
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160 {
00161
TYPE_OF_OPEN TypeOfOpen;
00162
00163
PAGED_CODE();
00164
00165
00166
00167
00168
00169
00170 TypeOfOpen = (
TYPE_OF_OPEN)
FlagOn( (ULONG_PTR) FileObject->FsContext2,
00171
TYPE_OF_OPEN_MASK );
00172
00173
if (TypeOfOpen ==
UnopenedFileObject) {
00174
00175 *Fcb =
NULL;
00176 *Ccb =
NULL;
00177
00178 }
else {
00179
00180
00181
00182
00183
00184
00185
00186 *Fcb = FileObject->FsContext;
00187 *Ccb = FileObject->FsContext2;
00188
00189
ClearFlag( (ULONG_PTR) *Ccb,
TYPE_OF_OPEN_MASK );
00190 }
00191
00192
00193
00194
00195
00196
return TypeOfOpen;
00197 }
00198
00199
00200
TYPE_OF_OPEN
00201 UdfFastDecodeFileObject (
00202 IN
PFILE_OBJECT FileObject,
00203 OUT
PFCB *Fcb
00204 )
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227 {
00228
PAGED_CODE();
00229
00230
ASSERT_FILE_OBJECT( FileObject );
00231
00232
00233
00234
00235
00236
00237 *Fcb = FileObject->FsContext;
00238
00239
return (
TYPE_OF_OPEN)
FlagOn( (ULONG_PTR) FileObject->FsContext2,
TYPE_OF_OPEN_MASK );
00240 }
00241