Index: drivers/filesystems/udfs/fsctrl.c =================================================================== --- drivers/filesystems/udfs/fsctrl.c (revision 0) +++ drivers/filesystems/udfs/fsctrl.c (working copy) @@ -0,0 +1,77 @@ +#include"procs.h" + +NTSTATUS FsFileSysControl( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + NTSTATUS Status; + PIO_STACK_LOCATION IrpStackLocation; + /*Getting parameters*/ + IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + + /*Make sure that we are not at IRQL > APC_LEVEL*/ + PAGED_CODE(); + + /*Dispaching...*/ + switch (IrpStackLocation->MinorFunction) + { + case IRP_MN_USER_FS_REQUEST: + Status=UserFsctl(IrpContext,Irp); + break; + case IRP_MN_MOUNT_VOLUME: + Status=MountVolume(IrpContext,Irp); + break; + case IRP_MN_VERIFY_VOLUME : + Status=VerifyVolume(IrpContext,Irp); + break; + default: + break; + CompleteRequest(IrpContext,Irp,STATUS_INVALID_DEVICE_REQUEST); + Status=STATUS_INVALID_DEVICE_REQUEST; + } + return Status; +} + +/************************************************************************************/ + +NTSTATUS +MountVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + PVPB Vpb; + NTSTATUS Status; + BOOLEAN UdfDisable=FALSE; + ULONG InputBuffer=0; + DISK_GEOMETRY DiskGeometry; + BOOLEAN Wait=TRUE; + + IO_STATUS_BLOCK IoStatusBlock; + /*Getting parameters*/ + PIO_STACK_LOCATION IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + PDEVICE_OBJECT DeviceObject=IrpStackLocation->Parameters.MountVolume.DeviceObject; + + return STATUS_NOT_IMPLEMENTED; +} +/************************************************************************************/ + +NTSTATUS UserFsctl ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + return STATUS_NOT_IMPLEMENTED; +} + + +/************************************************************************************/ +NTSTATUS VerifyVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ) +{ + return STATUS_NOT_IMPLEMENTED; +} +/************************************************************************************/ \ No newline at end of file Index: drivers/filesystems/udfs/misc.c =================================================================== --- drivers/filesystems/udfs/misc.c (revision 0) +++ drivers/filesystems/udfs/misc.c (working copy) @@ -0,0 +1,129 @@ +#include"procs.h" +/************************************************************************************/ +NTSTATUS UdfDispatch + ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ) +{ + NTSTATUS Status; + PIRP_CONTEXT IrpContext=NULL; + BOOLEAN Wait; + + /*Ensure that the UdfDispacth cannot be suspended*/ + FsRtlEnterFileSystem(); + + /*Set the wait flag.*/ + if (IoGetCurrentIrpStackLocation(Irp)->FileObject==NULL){ + Wait=TRUE; + }else{ + Wait=IoIsOperationSynchronous(Irp); + } + /*Creating irp context. */ + IrpContext=CreateIrpContext(Irp,Wait); + + + /*Dispatching...*/ + switch (IrpContext->MajorFunction) + { + case IRP_MJ_CREATE: + //Status=FsCreate(IrpContext,Irp); + break; + case IRP_MJ_READ: + //Status=FsRead(IrpContext,Irp); + break; + case IRP_MJ_WRITE: + //Status=FsWrite(IrpContext,Irp); + break; + case IRP_MJ_CLOSE: + //Status=FsClose(IrpContext,Irp); + break; + case IRP_MJ_QUERY_INFORMATION: + //Status=FsQueryInfo(IrpContext,Irp); + break; + case IRP_MJ_SET_INFORMATION: + //Status=FsSetInfo(IrpContext,Irp); + break; + case IRP_MJ_QUERY_VOLUME_INFORMATION: + //Status=FsQueryVolInfo(IrpContext,Irp); + break; + case IRP_MJ_DIRECTORY_CONTROL: + //Status=FsDirControl(IrpContext,Irp); + break; + case IRP_MJ_PNP: + //Status=FsPnp(IrpContext,Irp); + break; + case IRP_MJ_CLEANUP: + //Status=FsCleanup(IrpContext,Irp); + break; + case IRP_MJ_LOCK_CONTROL: + //Status=FsLockControl(IrpContext,Irp); + break; + case IRP_MJ_FILE_SYSTEM_CONTROL: + Status=FsFileSysControl(IrpContext,Irp); + default: + break; + } + + /*Release the lock */ + FsRtlExitFileSystem(); + + return Status; +} + + +/************************************************************************************/ +PIRP_CONTEXT CreateIrpContext( + IN PIRP Irp, + IN BOOLEAN Wait + ) +{ + PIRP_CONTEXT IrpContext=NULL; + /*Getting parameters*/ + PIO_STACK_LOCATION IrpStackLocation=IoGetCurrentIrpStackLocation(Irp); + + /*Make sure that we are not at IRQL > APC_LEVEL*/ + PAGED_CODE(); + + /*Allocate memory for IrpContext*/ + if (IrpContext==NULL){ + + IrpContext=(PIRP_CONTEXT)FsRtlAllocatePoolWithTag(NonPagedPool,sizeof(IRP_CONTEXT),'IRCO'); + } + /*Zero it*/ + RtlZeroMemory(IrpContext,sizeof(IRP_CONTEXT)); + + /*Set Irp*/ + IrpContext->Irp=Irp; + + /*Checking for a vaild FILE_OBJECT */ + if (IrpStackLocation->FileObject!=NULL){ + /*Setting the device object.*/ + IrpContext->RealDevice=IrpStackLocation->FileObject->DeviceObject; + + } + /* Is this our file system device object? */ + if (IrpStackLocation->DeviceObject!=UdfData.DeviceObjectGlobal){ + /*If it not, initialize VCB structure*/ + IrpContext->Vcb=&((PVOL_DEV_OBJ)IrpStackLocation->DeviceObject)->Vcb; + } + /*Setting the MajorFunction and MinorFunction */ + IrpContext->MajorFunction=IrpStackLocation->MajorFunction; + IrpContext->MinorFunction=IrpStackLocation->MinorFunction; + + /*Setting the wait flag*/ + if (Wait) IrpContext->Flags|= IRPCONTEXT_CANWAIT; + + return IrpContext; +} + +/************************************************************************************/ +VOID CompleteRequest ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp, + IN NTSTATUS Status + ) +{ + DbgPrint("CompleteRequest - Not Implemented. \n"); + return; +} Index: drivers/filesystems/udfs/procs.h =================================================================== --- drivers/filesystems/udfs/procs.h (revision 0) +++ drivers/filesystems/udfs/procs.h (working copy) @@ -0,0 +1,65 @@ +#include +#include +#include"udf.h" + + + +UDF_GLOBA_DATA UdfData; +FAST_IO_DISPATCH UdfFastIoDispatch; + + + + +NTSTATUS InitGlobalData( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceName + ); + +PIRP_CONTEXT CreateIrpContext( + IN PIRP Irp, + IN BOOLEAN CanWait + ); + +NTSTATUS UdfDispatch + ( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp + ); + +NTSTATUS FsFileSysControl( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + + VOID CompleteRequest ( + IN PIRP_CONTEXT IrpContext OPTIONAL, + IN PIRP Irp OPTIONAL, + IN NTSTATUS Status + ); + + NTSTATUS MountVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + + NTSTATUS UserFsctl ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + + NTSTATUS VerifyVolume ( + IN PIRP_CONTEXT IrpContext, + IN PIRP Irp + ); + + VOID ReleaseFromLazyWrite + ( + IN PVOID Context + ); + + BOOLEAN AcquireForLazyWrite + ( + IN PVOID Context, + IN BOOLEAN Wait + ); + Index: drivers/filesystems/udfs/udf.h =================================================================== --- drivers/filesystems/udfs/udf.h (revision 0) +++ drivers/filesystems/udfs/udf.h (working copy) @@ -0,0 +1,135 @@ + +#define IRPCONTEXT_CANWAIT 0x00000001 + + + + +typedef struct _UDF_GLOBA_DATA +{ + ERESOURCE Resource; + LIST_ENTRY VcbListHead; + + PDRIVER_OBJECT DriverObjectGlobal; + PDEVICE_OBJECT DeviceObjectGlobal; + + FAST_IO_DISPATCH FastIoDispatchIo; + + + NPAGED_LOOKASIDE_LIST NonPageFcbList; + NPAGED_LOOKASIDE_LIST ResourceList; + NPAGED_LOOKASIDE_LIST IrpContextList; + NPAGED_LOOKASIDE_LIST NonPageCcbList; + CACHE_MANAGER_CALLBACKS CacheMgrCallbacks; + CACHE_MANAGER_CALLBACKS CacheMgrVolCallbacks; + + LIST_ENTRY AsyncCloseQueue; + ULONG AsyncClosecount; + + LIST_ENTRY DelayedCloseQueue; + ULONG DelayedCloseCount; + + PIO_WORKITEM ColseItem; + FAST_MUTEX GlobalMutex; + +} UDF_GLOBA_DATA; +typedef UDF_GLOBA_DATA *PUDF_GLOBA_DATA; + + + + + +typedef enum _VCB_CONDITON { + VcbNotMounted=0, + VcbMountInProgress, + VcbMounted, + VcbInvalid, + VcbDismountInProgres +}VCB_CONDITON; + + +typedef struct _VCB { + + PVPB Vpb; + PVPB SwapVpb; + PDEVICE_OBJECT VcbDeviceObject; + PDEVICE_OBJECT TargDevObj; + struct _FCB *RootVcb; + + PFILE_LOCK VolLockFileObj; + + LIST_ENTRY VcbLinks; + + ULONG VcbState; + VCB_CONDITON VcbCondition; + + ULONG VcbCleanup; + ULONG VcbReference; + ULONG VcbUserReference; + + ERESOURCE VcbResource; + +}VCB; +typedef VCB *PVCB; + +typedef struct _IRP_CONTEXT{ + + PIRP Irp; + + PVCB Vcb; + ULONG Flags; + + PDEVICE_OBJECT RealDevice; + + struct _IRP_CONTEXT *TopLevel; + + UCHAR MajorFunction; + UCHAR MinorFunction; + + WORK_QUEUE_ITEM WorkQueueItem; +}IRP_CONTEXT; +typedef IRP_CONTEXT *PIRP_CONTEXT; + +typedef struct _FCB { + + FSRTL_ADVANCED_FCB_HEADER Header; + + ERESOURCE MainResource; + PVCB Vcb; + + + struct _FCB *ParentFcb; + + LIST_ENTRY FcbLinks; + + ULONG FcbState; + + ULONG FileAttributes; + + + SHARE_ACCESS ShareAccess; +}FCB; +typedef FCB *PFCB; + + + +typedef struct _CCB { + + ULONG Flags; + + PFCB Fcb; + + ULONG CurrDirOffset; + + UNICODE_STRING FileName; + +}CCB; +typedef CCB *PCCB; + + +typedef struct _VOL_DEV_OBJ +{ + DEVICE_OBJECT DeviceObject; + VCB Vcb; + +}VOL_DEV_OBJ; +typedef VOL_DEV_OBJ *PVOL_DEV_OBJ; \ No newline at end of file Index: drivers/filesystems/udfs/udfinit.c =================================================================== --- drivers/filesystems/udfs/udfinit.c (revision 0) +++ drivers/filesystems/udfs/udfinit.c (working copy) @@ -0,0 +1,157 @@ +#include"procs.h" + + + +/************************************************************************************/ +NTSTATUS DriverEntry + (IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPath) +{ + PDEVICE_OBJECT DeviceObject; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Udf"); + NTSTATUS Status; + + + /*Creating the device object*/ + Status=IoCreateDevice(DriverObject, + 0, + &DeviceName, + FILE_DEVICE_DISK_FILE_SYSTEM, + 0, + FALSE, + &DeviceObject); + + /*Check if the operation was successfull*/ + if (!NT_SUCCESS(Status)){ + return Status; + } + + /*Initialize golbal data.*/ + Status=InitGlobalData(DriverObject,DeviceObject); + + /*Delete the DeviceObject if the initialization fail.*/ + if (!NT_SUCCESS(Status)){ + IoDeleteDevice(DeviceObject); + return Status; + } + + + /*Initialize DriverObject dispatch table*/ + DriverObject->MajorFunction[IRP_MJ_CREATE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_WRITE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_READ] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_CLOSE] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_QUERY_VOLUME_INFORMATION]=(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_PNP] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_LOCK_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =(PDRIVER_DISPATCH)UdfDispatch; + DriverObject->DriverUnload = NULL; + + /*Initialize CC callbacks*/ + UdfData.CacheMgrCallbacks.AcquireForLazyWrite=AcquireForLazyWrite; + UdfData.CacheMgrCallbacks.ReleaseFromLazyWrite=ReleaseFromLazyWrite; + UdfData.CacheMgrCallbacks.AcquireForReadAhead=AcquireForLazyWrite; + UdfData.CacheMgrCallbacks.ReleaseFromReadAhead=ReleaseFromLazyWrite; + + + + //DriverObject->FastIoDispatch=&UdfFastIoDispatch; + + + /*Adding DeviceObject in global file system queue*/ + IoRegisterFileSystem(DeviceObject); + ObReferenceObject(DeviceObject); + + return(STATUS_SUCCESS); +} +/************************************************************************************/ +BOOLEAN AcquireForLazyWrite + ( + IN PVOID Context, + IN BOOLEAN Wait + ) +{ + DbgPrint("AcquireForLazyWrite - Not Implemented.\n"); + return TRUE; +} +/************************************************************************************/ +VOID ReleaseFromLazyWrite + ( + IN PVOID Context + ) +{ + DbgPrint("ReleaseFromLazyWrite - Not Implemented.\n"); + return; +} + +/************************************************************************************/ +NTSTATUS InitGlobalData + ( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT DeviceObject + ) +{ + + //TODO: Initialize CRC + + /*Zero UdfData */ + RtlZeroMemory(&UdfData,sizeof(UDF_GLOBA_DATA)); + + /*Zero UdfFastIoDispatch */ + RtlZeroMemory(&UdfFastIoDispatch,sizeof(FAST_IO_DISPATCH)); + + /*Setting the global DriverObject and DeviceObject*/ + UdfData.DriverObjectGlobal=DriverObject; + UdfData.DeviceObjectGlobal=DeviceObject; + + + /*Initialize VCB list*/ + InitializeListHead(&UdfData.VcbListHead); + + /*Initialize ERESOURCE */ + ExInitializeResourceLite(&UdfData.Resource); + + /*Initialize FCB lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.NonPageFcbList, + NULL, + NULL, + 0, + sizeof(FCB), + 'FCBL', + 0); + + /*Initialize CCB lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.NonPageCcbList, + NULL, + NULL, + 0, + sizeof(CCB), + 'CCBL', + 0); + + /*Initialize IRP_CONTEXT lookside list*/ + ExInitializeNPagedLookasideList(&UdfData.IrpContextList, + NULL, + NULL, + 0, + sizeof(IRP_CONTEXT), + 'IRPC', + 0); + + /*Initialize lists*/ + InitializeListHead(&UdfData.AsyncCloseQueue); + InitializeListHead(&UdfData.DelayedCloseQueue); + + /*Alloc a work item*/ + UdfData.ColseItem=IoAllocateWorkItem(DeviceObject); + /*Initialize mutex */ + ExInitializeFastMutex(&UdfData.GlobalMutex); + + return STATUS_SUCCESS; + +} \ No newline at end of file