fs_rec.c
来自「一个类似windows」· C语言 代码 · 共 255 行
C
255 行
/*
* ReactOS kernel
* Copyright (C) 2002,2003 ReactOS Team
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: drivers/fs/fs_rec/fs_rec.c
* PURPOSE: Filesystem recognizer driver
* PROGRAMMER: Eric Kohl
*/
/* INCLUDES *****************************************************************/
#define NDEBUG
#include <debug.h>
#include "fs_rec.h"
/* FUNCTIONS ****************************************************************/
static NTSTATUS STDCALL
FsRecCreate(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS Status;
Status = STATUS_SUCCESS;
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(Status);
}
static NTSTATUS STDCALL
FsRecClose(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(STATUS_SUCCESS);
}
static NTSTATUS STDCALL
FsRecFsControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
PDEVICE_EXTENSION DeviceExt;
NTSTATUS Status;
DeviceExt = DeviceObject->DeviceExtension;
switch (DeviceExt->FsType)
{
case FS_TYPE_VFAT:
Status = FsRecVfatFsControl(DeviceObject, Irp);
break;
case FS_TYPE_NTFS:
Status = FsRecNtfsFsControl(DeviceObject, Irp);
break;
case FS_TYPE_CDFS:
Status = FsRecCdfsFsControl(DeviceObject, Irp);
break;
case FS_TYPE_UDFS:
Status = FsRecUdfsFsControl(DeviceObject, Irp);
break;
default:
Status = STATUS_INVALID_DEVICE_REQUEST;
}
Irp->IoStatus.Status = Status;
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
return(Status);
}
static VOID STDCALL
FsRecUnload(IN PDRIVER_OBJECT DriverObject)
{
PDEVICE_OBJECT NextDevice;
PDEVICE_OBJECT ThisDevice;
/* Delete all remaining device objects */
NextDevice = DriverObject->DeviceObject;
while (NextDevice != NULL)
{
ThisDevice = NextDevice;
NextDevice = NextDevice->NextDevice;
IoDeleteDevice(ThisDevice);
}
}
static NTSTATUS
FsRecRegisterFs(PDRIVER_OBJECT DriverObject,
PCWSTR FsName,
PCWSTR RecognizerName,
ULONG DeviceType,
ULONG FsType)
{
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK IoStatus;
PDEVICE_EXTENSION DeviceExt;
UNICODE_STRING DeviceName;
UNICODE_STRING FileName;
PDEVICE_OBJECT DeviceObject;
HANDLE FileHandle;
NTSTATUS Status;
RtlInitUnicodeString(&FileName,
FsName);
InitializeObjectAttributes(&ObjectAttributes,
&FileName,
OBJ_CASE_INSENSITIVE,
0,
NULL);
Status = ZwCreateFile(&FileHandle,
0x100000,
&ObjectAttributes,
&IoStatus,
NULL,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
FILE_OPEN,
0,
NULL,
0);
if (NT_SUCCESS(Status))
{
ZwClose(FileHandle);
return(STATUS_IMAGE_ALREADY_LOADED);
}
/* Create recognizer device object */
RtlInitUnicodeString(&DeviceName,
RecognizerName);
Status = IoCreateDevice(DriverObject,
sizeof(DEVICE_EXTENSION),
&DeviceName,
DeviceType,
0,
FALSE,
&DeviceObject);
if (NT_SUCCESS(Status))
{
DeviceExt = DeviceObject->DeviceExtension;
DeviceExt->FsType = FsType;
IoRegisterFileSystem(DeviceObject);
DPRINT("Created recognizer device '%wZ'\n", &DeviceName);
}
return(Status);
}
NTSTATUS STDCALL
DriverEntry(PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
PCONFIGURATION_INFORMATION ConfigInfo;
ULONG DeviceCount;
NTSTATUS Status;
DPRINT("FileSystem recognizer 0.0.2\n");
DeviceCount = 0;
DriverObject->MajorFunction[IRP_MJ_CREATE] = FsRecCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] = FsRecClose;
DriverObject->MajorFunction[IRP_MJ_CLEANUP] = FsRecClose;
DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = FsRecFsControl;
DriverObject->DriverUnload = FsRecUnload;
ConfigInfo = IoGetConfigurationInformation();
if (ConfigInfo->CdRomCount > 0)
{
Status = FsRecRegisterFs(DriverObject,
L"\\Cdfs",
L"\\FileSystem\\CdfsRecognizer",
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
FS_TYPE_CDFS);
if (NT_SUCCESS(Status))
{
DeviceCount++;
}
Status = FsRecRegisterFs(DriverObject,
L"\\Udfs",
L"\\FileSystem\\UdfsRecognizer",
FILE_DEVICE_CD_ROM_FILE_SYSTEM,
FS_TYPE_UDFS);
if (NT_SUCCESS(Status))
{
DeviceCount++;
}
}
Status = FsRecRegisterFs(DriverObject,
L"\\Fat",
L"\\FileSystem\\FatRecognizer",
FILE_DEVICE_DISK_FILE_SYSTEM,
FS_TYPE_VFAT);
if (NT_SUCCESS(Status))
{
DeviceCount++;
}
Status = FsRecRegisterFs(DriverObject,
L"\\Ntfs",
L"\\FileSystem\\NtfsRecognizer",
FILE_DEVICE_DISK_FILE_SYSTEM,
FS_TYPE_NTFS);
if (NT_SUCCESS(Status))
{
DeviceCount++;
}
return((DeviceCount > 0) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL);
}
/* EOF */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?