1 /*++
2 
3 Copyright (c) Microsoft Corporation
4 
5 Module Name:
6 
7     FxFileObjectApi.cpp
8 
9 Abstract:
10 
11     This modules implements the C API's for the FxFileObject.
12 
13 Author:
14 
15 
16 
17 Environment:
18 
19     Both kernel and user mode
20 
21 Revision History:
22 
23 
24 --*/
25 
26 #include "coreprivshared.hpp"
27 #include "fxfileobject.hpp"
28 
29 extern "C" {
30 // #include "FxFileObjectApi.tmh"
31 }
32 
33 //
34 // Extern "C" the entire file
35 //
36 extern "C" {
37 
38 __drv_maxIRQL(PASSIVE_LEVEL)
39 PUNICODE_STRING
40 STDCALL
41 WDFEXPORT(WdfFileObjectGetFileName)(
42    __in
43    PWDF_DRIVER_GLOBALS DriverGlobals,
44    __in
45    WDFFILEOBJECT FileObject
46    )
47 
48 /*++
49 
50 Routine Description:
51 
52     This returns the UNICODE_STRING for the FileName inside
53     the WDM fileobject.
54 
55 Arguments:
56 
57     FileObject - WDFFILEOBJECT
58 
59 Return Value:
60 
61     PUNICODE_STRING (file name)
62 
63 --*/
64 
65 {
66     DDI_ENTRY();
67 
68     PFX_DRIVER_GLOBALS pFxDriverGlobals;
69     NTSTATUS status;
70     FxFileObject* pFO;
71 
72     //
73     // Validate the FileObject object handle, and get its FxFileObject*
74     //
75     FxObjectHandleGetPtrAndGlobals(GetFxDriverGlobals(DriverGlobals),
76                                    FileObject,
77                                    FX_TYPE_FILEOBJECT,
78                                    (PVOID*)&pFO,
79                                    &pFxDriverGlobals);
80 
81     status = FxVerifierCheckIrqlLevel(pFxDriverGlobals, PASSIVE_LEVEL);
82     if (!NT_SUCCESS(status)) {
83         return NULL;
84     }
85 
86     if (pFO->GetWdmFileObject() != NULL) {
87         return pFO->GetFileName();
88     }
89     else {
90         return NULL;
91     }
92 }
93 
94 
95 __drv_maxIRQL(DISPATCH_LEVEL)
96 ULONG
97 STDCALL
98 WDFEXPORT(WdfFileObjectGetFlags)(
99    __in
100    PWDF_DRIVER_GLOBALS DriverGlobals,
101    __in
102    WDFFILEOBJECT FileObject
103    )
104 
105 /*++
106 
107 Routine Description:
108 
109     This returns the flags inside the WDM fileobject.
110 
111 Arguments:
112 
113     FileObject - WDFFILEOBJECT
114 
115 Return Value:
116 
117     ULONG (flags)
118 
119 --*/
120 
121 {
122    DDI_ENTRY();
123 
124    FxFileObject* pFO;
125 
126    //
127    // Validate the FileObject object handle, and get its FxFileObject*
128    //
129    FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals),
130                         FileObject,
131                         FX_TYPE_FILEOBJECT,
132                         (PVOID*)&pFO);
133 
134    if (pFO->GetWdmFileObject() != NULL) {
135        return pFO->GetFlags();
136    }
137    else {
138        return 0x0;
139    }
140 }
141 
142 __drv_maxIRQL(DISPATCH_LEVEL)
143 WDFDEVICE
144 STDCALL
145 WDFEXPORT(WdfFileObjectGetDevice)(
146    __in
147    PWDF_DRIVER_GLOBALS DriverGlobals,
148    __in
149    WDFFILEOBJECT FileObject
150    )
151 
152 /*++
153 
154 Routine Description:
155 
156     This returns the Device that the fileobject is associated with.
157 
158 Arguments:
159 
160     FileObject - WDFFILEOBJECT
161 
162 Return Value:
163 
164     WDFDEVICE
165 
166 --*/
167 
168 {
169     DDI_ENTRY();
170 
171     FxFileObject* pFO;
172 
173     //
174     // Validate the FileObject object handle, and get its FxFileObject*
175     //
176     FxObjectHandleGetPtr(GetFxDriverGlobals(DriverGlobals),
177                         FileObject,
178                         FX_TYPE_FILEOBJECT,
179                         (PVOID*)&pFO);
180 
181     return pFO->GetDevice()->GetHandle();
182 }
183 
184 } // extern "C"
185