00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <nt.h>
00013
#include <ntrtl.h>
00014
#include <nturtl.h>
00015
#include <windows.h>
00016
#include <ole2.h>
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
NTSTATUS
00036 SynchronousNtFsControlFile(
00037 IN HANDLE h,
00038 OUT IO_STATUS_BLOCK *pisb,
00039 IN ULONG FsControlCode,
00040 IN VOID *pvIn OPTIONAL,
00041 IN ULONG cbIn,
00042 OUT VOID *pvOut OPTIONAL,
00043 IN ULONG cbOut)
00044 {
00045
NTSTATUS Status;
00046
00047
Status =
NtFsControlFile(
00048 h,
00049
NULL,
00050
NULL,
00051
NULL,
00052 pisb,
00053 FsControlCode,
00054 pvIn,
00055 cbIn,
00056 pvOut,
00057 cbOut);
00058
00059
if (
Status == STATUS_PENDING)
00060 {
00061
Status =
NtWaitForSingleObject(h,
TRUE,
NULL);
00062 }
00063
return(
Status);
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
#if defined(_CAIRO_) || DBG
00080
00081
#include "iofs.h"
00082
00083
NTSTATUS
00084 UsnFsctl(
00085 IN HANDLE hf,
00086 OUT USN *pusn,
00087 IN ULONG FsControlCode)
00088 {
00089
NTSTATUS Status;
00090 IO_STATUS_BLOCK isb;
00091
00092
Status =
SynchronousNtFsControlFile(
00093 hf,
00094 &isb,
00095 FsControlCode,
00096 NULL,
00097 0,
00098 pusn,
00099
sizeof(*pusn));
00100
ASSERT(!
NT_SUCCESS(Status) || isb.Information ==
sizeof(*pusn));
00101
return(
Status);
00102 }
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
NTSTATUS NTSYSAPI NTAPI
00117 OFSGetCloseUsn(
00118 IN HANDLE hf,
00119 OUT USN *pusn)
00120 {
00121
return(UsnFsctl(hf, pusn, FSCTL_OFS_USN_GET_CLOSE));
00122 }
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
NTSTATUS NTSYSAPI NTAPI
00137 RtlGenerateUsn(
00138 IN HANDLE hf,
00139 OUT USN *pusn)
00140 {
00141
return(UsnFsctl(hf, pusn, FSCTL_OFS_USN_GENERATE));
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
#define QuadAlign(n) (((n) + (sizeof(LONGLONG) - 1)) & ~(sizeof(LONGLONG) - 1))
00159
00160
#define CSTRUCT(n, type, cchname) \
00161
(((n) * QuadAlign(sizeof(type) + (cchname) * sizeof(WCHAR)) + \
00162
sizeof(type) - 1) / \
00163
sizeof(type))
00164
00165
NTSTATUS NTSYSAPI NTAPI
00166 OFSGetVersion(HANDLE hf, ULONG *pversion)
00167 {
00168
NTSTATUS Status;
00169 IO_STATUS_BLOCK isb;
00170
00171 FILE_FS_ATTRIBUTE_INFORMATION *pfai;
00172 LARGE_INTEGER faibuf[CSTRUCT(1, FILE_FS_ATTRIBUTE_INFORMATION, 32)];
00173
00174 pfai = (FILE_FS_ATTRIBUTE_INFORMATION *) faibuf;
00175
00176
Status =
NtQueryVolumeInformationFile(
00177 hf,
00178 &isb,
00179 pfai,
00180
sizeof(faibuf),
00181 FileFsAttributeInformation);
00182
if (
NT_SUCCESS(Status))
00183 {
00184
if (pfai->FileSystemNameLength != 3 *
sizeof(WCHAR) ||
00185 pfai->FileSystemName[0] !=
L'O' ||
00186 pfai->FileSystemName[1] !=
L'F' ||
00187 pfai->FileSystemName[2] !=
L'S')
00188 {
00189
Status = STATUS_UNRECOGNIZED_VOLUME;
00190 }
00191
else if (pversion !=
NULL)
00192 {
00193
00194
Status =
SynchronousNtFsControlFile(
00195 hf,
00196 &isb,
00197 FSCTL_OFS_VERSION,
00198 NULL,
00199 0,
00200 pversion,
00201
sizeof(*pversion));
00202
00203
ASSERT(!
NT_SUCCESS(Status) || isb.Information ==
sizeof(*pversion));
00204 }
00205 }
00206
return(
Status);
00207 }
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
NTSTATUS NTSYSAPI NTAPI
00225 RtlNameToOleId(
00226 IN HANDLE hf,
00227 IN ULONG cbNames,
00228 IN OLENAMES
const *pon,
00229 OUT ULONG *pOleId)
00230 {
00231
NTSTATUS Status;
00232 IO_STATUS_BLOCK isb;
00233
00234
Status =
SynchronousNtFsControlFile(
00235 hf,
00236 &isb,
00237 FSCTL_OFS_TRANSLATE_OLENAMES,
00238 (VOID *) pon,
00239 cbNames,
00240 pOleId,
00241 pon->cNames *
sizeof(*pOleId));
00242
return(
Status);
00243 }
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
NTSTATUS NTSYSAPI NTAPI
00262 RtlOleIdToName(
00263 IN HANDLE hf,
00264 IN ULONG cOleId,
00265 IN ULONG
const *pOleId,
00266 IN OUT ULONG *pcbNameBuf,
00267 OUT OLENAMES *pon)
00268 {
00269
NTSTATUS Status;
00270 IO_STATUS_BLOCK isb;
00271
00272
Status =
SynchronousNtFsControlFile(
00273 hf,
00274 &isb,
00275 FSCTL_OFS_TRANSLATE_OLEIDS,
00276 (VOID *) pOleId,
00277 cOleId *
sizeof(*pOleId),
00278 pon,
00279 *pcbNameBuf);
00280 *pcbNameBuf = isb.Information;
00281
return(
Status);
00282 }
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
NTSTATUS NTSYSAPI NTAPI
00299 RtlQueryQuota(
00300 IN HANDLE hf,
00301 IN OUT ULONG *pcb,
00302 IN OUT FILE_QUOTA_INFORMATION *pfqi)
00303 {
00304
NTSTATUS Status;
00305 IO_STATUS_BLOCK isb;
00306
00307
Status =
SynchronousNtFsControlFile(
00308 hf,
00309 &isb,
00310 FSCTL_OFS_QUERY_QUOTA,
00311 pfqi,
00312 *pcb,
00313 pfqi,
00314 *pcb);
00315
00316 *pcb = isb.Information;
00317
return(
Status);
00318 }
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332 FILE_OBJECTID_INFORMATION foiiZero;
00333
00334
NTSTATUS NTSYSAPI NTAPI
00335 RtlQueryClassId(
00336 IN HANDLE hf,
00337 OUT GUID *pclsid)
00338 {
00339
NTSTATUS Status;
00340 IO_STATUS_BLOCK isb;
00341 FILE_OLE_INFORMATION foi;
00342
00343
ASSERT(
sizeof(GUID) ==
sizeof(foiiZero.ObjectId.Lineage));
00344
Status =
NtQueryInformationFile(
00345 hf,
00346 &isb,
00347 &foi,
00348
sizeof(foi),
00349 FileOleInformation);
00350
if (
NT_SUCCESS(Status))
00351 {
00352
if (RtlCompareMemory(
00353 &foiiZero.ObjectId.Lineage,
00354 &foi.OleClassIdInformation.ClassId,
00355
sizeof(foiiZero.ObjectId.Lineage)) ==
00356
sizeof(foiiZero.ObjectId.Lineage))
00357 {
00358
Status = STATUS_NOT_FOUND;
00359 }
00360
else
00361 {
00362 *pclsid = foi.OleClassIdInformation.ClassId;
00363 }
00364 }
00365
return(
Status);
00366 }
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
NTSTATUS NTSYSAPI NTAPI
00381 RtlSetClassId(
00382 IN HANDLE hf,
00383 OPTIONAL IN GUID
const *pclsid)
00384 {
00385
NTSTATUS Status;
00386 IO_STATUS_BLOCK isb;
00387
00388
ASSERT(
sizeof(foiiZero.ObjectId.Lineage) ==
sizeof(*pclsid));
00389
Status =
NtSetInformationFile(
00390 hf,
00391 &isb,
00392 pclsid == NULL? &foiiZero.ObjectId.Lineage : (VOID *) pclsid,
00393
sizeof(foiiZero.ObjectId.Lineage),
00394 FileOleClassIdInformation);
00395
return(
Status);
00396 }
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
NTSTATUS NTSYSAPI NTAPI
00411 RtlQueryObjectId(
00412 IN HANDLE hf,
00413 OUT OBJECTID *poid)
00414 {
00415
NTSTATUS Status;
00416 IO_STATUS_BLOCK isb;
00417 FILE_OLE_INFORMATION foi;
00418
00419
Status =
NtQueryInformationFile(
00420 hf,
00421 &isb,
00422 &foi,
00423
sizeof(foi),
00424 FileOleInformation);
00425
if (
NT_SUCCESS(Status))
00426 {
00427
if (RtlCompareMemory(
00428 &foiiZero.ObjectId,
00429 &foi.ObjectIdInformation.ObjectId,
00430
sizeof(foiiZero.ObjectId)) ==
sizeof(foiiZero.ObjectId))
00431 {
00432
Status = STATUS_NOT_FOUND;
00433 }
00434
else
00435 {
00436 *poid = foi.ObjectIdInformation.ObjectId;
00437 }
00438 }
00439
return(
Status);
00440 }
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
NTSTATUS NTSYSAPI NTAPI
00455 RtlSetObjectId(
00456 IN HANDLE hf,
00457 OPTIONAL IN OBJECTID
const *poid)
00458 {
00459
NTSTATUS Status;
00460 IO_STATUS_BLOCK isb;
00461
00462
ASSERT(
sizeof(foiiZero) ==
sizeof(*poid));
00463
Status =
NtSetInformationFile(
00464 hf,
00465 &isb,
00466 poid == NULL? &foiiZero : (VOID *) poid,
00467
sizeof(foiiZero),
00468 FileObjectIdInformation);
00469
return(
Status);
00470 }
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
NTSTATUS
00487 RtlSetTunnelMode(
00488 IN HANDLE hVolume,
00489 IN ULONG ulFlags,
00490 IN ULONG ulMask,
00491 OUT ULONG *pulOld)
00492 {
00493 TUNNELMODE tm;
00494 TUNNELMODEOUT tmo;
00495
NTSTATUS Status;
00496 IO_STATUS_BLOCK isb;
00497
00498 tm.ulFlags = ulFlags;
00499 tm.ulMask = ulMask;
00500
00501
Status =
SynchronousNtFsControlFile(
00502 hVolume,
00503 &isb,
00504 FSCTL_OFS_TUNNEL_MODE,
00505 &tm,
00506
sizeof(tm),
00507 &tmo,
00508
sizeof(tmo));
00509
00510 *pulOld = tmo.ulFlags;
00511
return(
Status);
00512 }
00513
00514
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
NTSTATUS NTSYSAPI NTAPI
00531 RtlSearchVolume(
00532 IN HANDLE hAncestor,
00533 IN OBJECTID
const *poid,
00534 IN USHORT cLineage,
00535 IN BOOLEAN fContinue,
00536 IN ULONG usBufLen,
00537 OUT FINDOBJECTOUT *pfoo)
00538 {
00539
NTSTATUS Status;
00540 IO_STATUS_BLOCK isb;
00541
00542 ((FINDOBJECT *) pfoo)->oid = *poid;
00543 ((FINDOBJECT *) pfoo)->cLineage = cLineage;
00544 ((FINDOBJECT *) pfoo)->ulFlags = fContinue? FO_CONTINUE_ENUM : 0;
00545
00546
Status =
SynchronousNtFsControlFile(
00547 hAncestor,
00548 &isb,
00549 FSCTL_OFS_FINDOBJECT,
00550 pfoo,
00551
sizeof(FINDOBJECT),
00552 pfoo,
00553 usBufLen);
00554
return(
Status);
00555 }
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
VOID NTSYSAPI NTAPI
00570 RtlGenerateRelatedObjectId(
00571 IN OBJECTID
const *poidOld,
00572 OUT OBJECTID *poidNew)
00573 {
00574 poidNew->Lineage = poidOld->Lineage;
00575
do
00576 {
00577 poidNew->Uniquifier = rand();
00578 }
while (poidNew->Uniquifier == poidOld->Uniquifier);
00579 }
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591
00592
NTSTATUS NTSYSAPI NTAPI
00593 RtlSetReplicationState(
00594 IN HANDLE hf)
00595 {
00596 IO_STATUS_BLOCK isb;
00597
00598
return(
SynchronousNtFsControlFile(
00599 hf,
00600 &isb,
00601 FSCTL_SET_REPLICATION_STATE,
00602 NULL,
00603 0,
00604 NULL,
00605 0));
00606 }
00607
00608
#endif // _CAIRO_
00609
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621
VOID __cdecl
00622 _purecall(VOID)
00623 {
00624
ASSERTMSG(
"_purecall() was called",
FALSE);
00625
RtlRaiseStatus(STATUS_NOT_IMPLEMENTED);
00626 }