| 208 | } |
| 209 | |
| 210 | NTSTATUS FileManager::IrpCreateFile( |
| 211 | _Out_ PFILE_OBJECT* pFileObject, |
| 212 | _Out_ PDEVICE_OBJECT* pDeviceObject, |
| 213 | _In_ ACCESS_MASK DesiredAccess, |
| 214 | _In_ PCWSTR DosName, |
| 215 | _Out_ PIO_STATUS_BLOCK IoStatusBlock, |
| 216 | _In_opt_ PLARGE_INTEGER AllocationSize, |
| 217 | _In_ ULONG FileAttributes, |
| 218 | _In_ ULONG ShareAccess, |
| 219 | _In_ ULONG CreateDisposition, |
| 220 | _In_ ULONG CreateOptions, |
| 221 | _In_reads_bytes_opt_(EaLength) PVOID EaBuffer, |
| 222 | _In_ ULONG EaLength |
| 223 | ) { |
| 224 | PAUX_ACCESS_DATA AuxData = nullptr; |
| 225 | HANDLE hRoot = nullptr; |
| 226 | PFILE_OBJECT RootObject = nullptr, FileObject = nullptr; |
| 227 | PDEVICE_OBJECT DeviceObject = nullptr, RealDeviceObject = nullptr; |
| 228 | PIRP Irp; |
| 229 | PIO_STACK_LOCATION stack; |
| 230 | NTSTATUS status = STATUS_UNSUCCESSFUL; |
| 231 | ACCESS_STATE AccessState; |
| 232 | KEVENT notifyEvent; |
| 233 | IO_SECURITY_CONTEXT IoSecurityContext; |
| 234 | UNICODE_STRING rootName, fileName; |
| 235 | RtlInitUnicodeString(&fileName, &DosName[2]); |
| 236 | |
| 237 | do |
| 238 | { |
| 239 | // ��Ŀ¼ |
| 240 | IO_STATUS_BLOCK ioStatus; |
| 241 | status = GetRootName(DosName, &rootName); |
| 242 | if (!NT_SUCCESS(status)) { |
| 243 | break; |
| 244 | } |
| 245 | ObjectAttributes attr(&rootName, ObjectAttributesFlags::Caseinsensive | ObjectAttributesFlags::KernelHandle); |
| 246 | status = IoCreateFile(&hRoot, FILE_READ_ATTRIBUTES | SYNCHRONIZE, &attr, &ioStatus, nullptr, |
| 247 | FILE_ATTRIBUTE_NORMAL, |
| 248 | FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, |
| 249 | FILE_OPEN, |
| 250 | FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT, |
| 251 | nullptr, 0, CreateFileTypeNone, nullptr, IO_NO_PARAMETER_CHECKING); |
| 252 | *IoStatusBlock = ioStatus; |
| 253 | if (!NT_SUCCESS(status)) { |
| 254 | break; |
| 255 | } |
| 256 | |
| 257 | // �õ���Ŀ¼�ļ����� |
| 258 | status = ObReferenceObjectByHandle(hRoot, |
| 259 | FILE_READ_ATTRIBUTES, |
| 260 | *IoFileObjectType, |
| 261 | KernelMode, |
| 262 | (PVOID*)&RootObject, |
| 263 | nullptr); |
| 264 | if (!NT_SUCCESS(status)) { |
| 265 | break; |
| 266 | } |
| 267 |
nothing calls this directly
no test coverage detected