<directory name="downloader">
<xi:include href="downloader/downloader.rbuild" />
</directory>
-<!--
- <directory name="ext2">
- <xi:include href="ext2/ext2.rbuild" />
- </directory>
--->
+
<directory name="fontview">
<xi:include href="fontview/fontview.rbuild" />
</directory>
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/attr.c
- * PURPOSE: Set/Get file attributes support
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-#include <wchar.h>
-#include <string.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS STDCALL
-Ext2SetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2SetInformation(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp,
- IO_NO_INCREMENT);
-
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2QueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- NTSTATUS Status;
- PIO_STACK_LOCATION Param;
- PFILE_OBJECT FileObject;
- PDEVICE_EXTENSION DeviceExt;
- ULONG Length;
- PFILE_BASIC_INFORMATION PFileBasicInformation;
- PFILE_STANDARD_INFORMATION PFileStandardInformation;
- PFILE_INTERNAL_INFORMATION PFileInternalInformation;
- PFILE_EA_INFORMATION PFileEaInformation;
- PFILE_ACCESS_INFORMATION PFileAccessInformation;
- PFILE_NAME_INFORMATION PFileNameInformation;
- PFILE_POSITION_INFORMATION PFilePositionInformation;
- PVOID Buffer;
-
- DPRINT("Ext2QueryInformation(DeviceObject %x Irp %x)\n", DeviceObject, Irp);
-
- Param = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Param->FileObject;
- DeviceExt = DeviceObject->DeviceExtension;
- Length = Param->Parameters.QueryFile.Length;
- Buffer = Irp->AssociatedIrp.SystemBuffer;
-
- switch (Param->Parameters.QueryFile.FileInformationClass)
- {
- case FileDirectoryInformation:
- case FileFullDirectoryInformation:
- case FileBothDirectoryInformation:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
-
- case FileBasicInformation:
- PFileBasicInformation = (PFILE_BASIC_INFORMATION)Buffer;
- memset(PFileBasicInformation, 0, sizeof(FILE_BASIC_INFORMATION));
- Status = STATUS_SUCCESS;
- break;
-
- case FileStandardInformation:
- PFileStandardInformation = (PFILE_STANDARD_INFORMATION)Buffer;
- memset(PFileStandardInformation, 0, sizeof(FILE_STANDARD_INFORMATION));
- Status = STATUS_SUCCESS;
- break;
-
- case FileInternalInformation:
- PFileInternalInformation = (PFILE_INTERNAL_INFORMATION)Buffer;
- memset(PFileInternalInformation, 0, sizeof(FILE_INTERNAL_INFORMATION));
- Status = STATUS_SUCCESS;
- break;
-
- case FileEaInformation:
- PFileEaInformation = (PFILE_EA_INFORMATION)Buffer;
- memset(PFileEaInformation, 0, sizeof(FILE_EA_INFORMATION));
- PFileEaInformation->EaSize = 0;
- Status = STATUS_SUCCESS;
- break;
-
- case FileAccessInformation:
- PFileAccessInformation = (PFILE_ACCESS_INFORMATION)Buffer;
- memset(PFileAccessInformation, 0, sizeof(FILE_ACCESS_INFORMATION));
- PFileAccessInformation->AccessFlags = 0;
- Status = STATUS_SUCCESS;
- break;
-
- case FileNameInformation:
- PFileNameInformation = (PFILE_NAME_INFORMATION)Buffer;
- memset(PFileNameInformation, 0, sizeof(FILE_NAME_INFORMATION));
- Status = STATUS_SUCCESS;
- break;
-
- case FilePositionInformation:
- PFilePositionInformation = (PFILE_POSITION_INFORMATION)Buffer;
- memcpy(PFilePositionInformation,
- &FileObject->CurrentByteOffset,
- sizeof(FileObject->CurrentByteOffset));
- Status = STATUS_SUCCESS;
- break;
-
- case FileRenameInformation:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
-
- default:
- Status = STATUS_NOT_SUPPORTED;
- }
-
-
-
-
- Irp->IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
- Irp->IoStatus.Information =
- Param->Parameters.QueryFile.Length - Length;
- else
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp,
- IO_NO_INCREMENT);
-
- return(Status);
-}
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/blockdev.c
- * PURPOSE: Temporary sector reading support
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ***************************************************************/
-
-BOOLEAN
-Ext2ReadSectors(IN PDEVICE_OBJECT pDeviceObject,
- IN ULONG DiskSector,
- IN ULONG SectorCount,
- IN PVOID Buffer)
-{
- LARGE_INTEGER sectorNumber;
- PIRP irp;
- IO_STATUS_BLOCK ioStatus;
- KEVENT event;
- NTSTATUS status;
- ULONG sectorSize;
- int j;
-
- DPRINT("VFATReadSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
- pDeviceObject,DiskSector,Buffer);
-
- sectorNumber.u.HighPart = 0;
- sectorNumber.u.LowPart = DiskSector * BLOCKSIZE;
-
- DPRINT("DiskSector:%ld BLKSZ:%ld sectorNumber:%ld:%ld\n",
- (unsigned long) DiskSector,
- (unsigned long) BLOCKSIZE,
- (unsigned long) sectorNumber.u.HighPart,
- (unsigned long) sectorNumber.u.LowPart);
-
- KeInitializeEvent(&event, NotificationEvent, FALSE);
-
- sectorSize = BLOCKSIZE*SectorCount;
-
-
- DPRINT("Building synchronous FSD Request...\n");
- irp = IoBuildSynchronousFsdRequest(IRP_MJ_READ,
- pDeviceObject,
- Buffer,
- sectorSize,
- §orNumber,
- &event,
- &ioStatus );
-
- if (!irp)
- {
- DbgPrint("READ failed!!!\n");
- return FALSE;
- }
-
- DPRINT("Calling IO Driver...\n");
- status = IoCallDriver(pDeviceObject, irp);
-
- DPRINT("Waiting for IO Operation...\n");
- if (status == STATUS_PENDING)
- {
- KeWaitForSingleObject(&event,
- Suspended,
- KernelMode,
- FALSE,
- NULL);
- DPRINT("Getting IO Status...\n");
- status = ioStatus.Status;
- }
-
- if (!NT_SUCCESS(status))
- {
- DbgPrint("IO failed!!! Error code: %d(%x)\n", status, status);
- return FALSE;
- }
-
- return TRUE;
-}
-
-BOOLEAN VFATWriteSectors(IN PDEVICE_OBJECT pDeviceObject,
- IN ULONG DiskSector,
- IN ULONG SectorCount,
- IN UCHAR* Buffer)
-{
- LARGE_INTEGER sectorNumber;
- PIRP irp;
- IO_STATUS_BLOCK ioStatus;
- KEVENT event;
- NTSTATUS status;
- ULONG sectorSize;
- PULONG mbr;
- int j;
-
- DPRINT("VFATWriteSector(pDeviceObject %x, DiskSector %d, Buffer %x)\n",
- pDeviceObject,DiskSector,Buffer);
-
- sectorNumber.u.HighPart = 0;
- sectorNumber.u.LowPart = DiskSector * BLOCKSIZE;
-
- KeInitializeEvent(&event, NotificationEvent, FALSE);
-
- sectorSize = BLOCKSIZE*SectorCount;
-
-
- DPRINT("Building synchronous FSD Request...\n");
- irp = IoBuildSynchronousFsdRequest(IRP_MJ_WRITE,
- pDeviceObject,
- Buffer,
- sectorSize,
- §orNumber,
- &event,
- &ioStatus );
-
- if (!irp) {
- DbgPrint("WRITE failed!!!\n");
- return FALSE;
- }
-
- DPRINT("Calling IO Driver...\n");
- status = IoCallDriver(pDeviceObject,
- irp);
-
- DPRINT("Waiting for IO Operation...\n");
- if (status == STATUS_PENDING) {
- KeWaitForSingleObject(&event,
- Suspended,
- KernelMode,
- FALSE,
- NULL);
- DPRINT("Getting IO Status...\n");
- status = ioStatus.Status;
- }
-
- if (!NT_SUCCESS(status)) {
- DbgPrint("IO failed!!! Error code: %d(%x)\n", status, status);
- return FALSE;
- }
-
-
- ExFreePool(mbr);
- DPRINT("Block request succeeded\n");
- return TRUE;
-}
-
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/dir.c
- * PURPOSE: ext2 filesystem
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-#include <wchar.h>
-#include <string.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS *****************************************************************/
-
-
-static VOID Ext2ConvertName(PWSTR Out, PCH In, ULONG Len)
-{
- ULONG i;
-
- for (i=0; i<Len; i++)
- {
- *Out = *In;
- Out++;
- In++;
- }
- *Out = 0;
-}
-
-PVOID Ext2ProcessDirEntry(PDEVICE_EXTENSION DeviceExt,
- struct ext2_dir_entry* dir_entry,
- PIO_STACK_LOCATION IoStack,
- PVOID Buffer,
- ULONG FileIndex)
-{
- PFILE_DIRECTORY_INFORMATION FDI;
- PFILE_NAMES_INFORMATION FNI;
- PFILE_BOTH_DIRECTORY_INFORMATION FBI;
- struct ext2_inode inode;
-
- DPRINT("FileIndex %d\n",FileIndex);
- DPRINT("Buffer %x\n",Buffer);
-
- Ext2ReadInode(DeviceExt,
- dir_entry->inode,
- &inode);
-
- switch (IoStack->Parameters.QueryDirectory.FileInformationClass)
- {
- case FileNamesInformation:
- FNI = (PFILE_NAMES_INFORMATION)Buffer;
- FNI->NextEntryOffset = sizeof(FileDirectoryInformation) +
- dir_entry->name_len + 1;
- FNI->FileNameLength = dir_entry->name_len;
- Ext2ConvertName(FNI->FileName, dir_entry->name, dir_entry->name_len);
- Buffer = Buffer + FNI->NextEntryOffset;
- break;
-
- case FileDirectoryInformation:
- FDI = (PFILE_DIRECTORY_INFORMATION)Buffer;
- FDI->NextEntryOffset = sizeof(FileDirectoryInformation) +
- dir_entry->name_len + 1;
- FDI->FileIndex = FileIndex;
-// FDI->CreationTime = 0;
-// FDI->LastAccessTime = 0;
-// FDI->LastWriteTime = 0;
-// FDI->ChangeTime = 0;
- FDI->AllocationSize.QuadPart = FDI->EndOfFile.QuadPart = inode.i_size;
- FDI->FileAttributes = 0;
- FDI->FileNameLength = dir_entry->name_len;
- Ext2ConvertName(FDI->FileName, dir_entry->name, dir_entry->name_len);
- Buffer = Buffer + FDI->NextEntryOffset;
- break;
-
- case FileBothDirectoryInformation:
- FBI = (PFILE_BOTH_DIRECTORY_INFORMATION)Buffer;
- FBI->NextEntryOffset = sizeof(FileBothDirectoryInformation) +
- dir_entry->name_len + 1;
- FBI->FileIndex = FileIndex;
- FBI->AllocationSize.QuadPart = FBI->EndOfFile.QuadPart = inode.i_size;
- FBI->FileAttributes = 0;
- FBI->FileNameLength = dir_entry->name_len;
- Ext2ConvertName(FBI->FileName, dir_entry->name, dir_entry->name_len);
- memset(FBI->ShortName, 0, sizeof(FBI->ShortName));
- Buffer = Buffer + FBI->NextEntryOffset;
- break;
-
- default:
- UNIMPLEMENTED;
- }
- return(Buffer);
-}
-
-
-NTSTATUS Ext2QueryDirectory(PDEVICE_EXTENSION DeviceExt,
- PEXT2_FCB Fcb,
- PIRP Irp,
- PIO_STACK_LOCATION IoStack)
-{
- ULONG Max;
- ULONG i;
- ULONG StartIndex;
- PVOID Buffer = NULL;
- struct ext2_dir_entry dir_entry;
-
- Buffer = Irp->UserBuffer;
- DPRINT("Buffer %x\n",Buffer);
- DPRINT("IoStack->Flags %x\n",IoStack->Flags);
-
- if (IoStack->Flags & SL_RETURN_SINGLE_ENTRY)
- {
- Max = 1;
- }
- else
- {
- UNIMPLEMENTED;
- }
-
- DPRINT("Buffer->FileIndex %d\n",
- ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex);
- if (IoStack->Flags & SL_INDEX_SPECIFIED)
- {
- StartIndex = ((PFILE_DIRECTORY_INFORMATION)Buffer)->FileIndex;
- }
- else
- {
- StartIndex = 0;
- }
-
- if (IoStack->Flags & SL_RESTART_SCAN)
- {
- StartIndex = 0;
- }
-
- DPRINT("StartIndex %d\n",StartIndex);
-
- for (i=0; i<Max ;i++)
- {
- if (!Ext2ScanDir(DeviceExt,&Fcb->inode,"*",&dir_entry,&StartIndex))
- {
- ((PFILE_DIRECTORY_INFORMATION)Buffer)->NextEntryOffset = 0;
- return(STATUS_NO_MORE_FILES);
- }
- Buffer = Ext2ProcessDirEntry(DeviceExt,
- &dir_entry,
- IoStack,
- Buffer,
- StartIndex);
- }
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS STDCALL
-Ext2DirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PFILE_OBJECT FileObject = Stack->FileObject;
- PEXT2_FCB Fcb = (PVOID)FileObject->FsContext;
- NTSTATUS Status;
- PDEVICE_EXTENSION DeviceExt;
-
- DPRINT("Ext2DirectoryControl(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
-
- DeviceExt = DeviceObject->DeviceExtension;
-
- switch (Stack->MinorFunction)
- {
- case IRP_MN_QUERY_DIRECTORY:
- Status = Ext2QueryDirectory(DeviceExt, Fcb, Irp, Stack);
- break;
-
- default:
- Status = STATUS_UNSUCCESSFUL;
- }
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
-
-BOOL Ext2ScanDir(PDEVICE_EXTENSION DeviceExt,
- struct ext2_inode* dir,
- PCH filename,
- struct ext2_dir_entry* ret,
- PULONG StartIndex)
-{
- ULONG i;
- char* buffer;
- ULONG offset;
- char name[255];
- struct ext2_dir_entry* current;
- ULONG block;
- BOOL b;
-
- DPRINT("Ext2ScanDir(dir %x, filename %s, ret %x)\n",dir,filename,ret);
-
- buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
-
- for (i=0; i<((*StartIndex)/BLOCKSIZE); i++);
- for (; (block = Ext2BlockMap(DeviceExt, dir, i)) != 0; i++)
- {
- DPRINT("block %d\n",block);
- b = Ext2ReadSectors(DeviceExt->StorageDevice,
- block,
- 1,
- buffer);
- if (!b)
- {
- DbgPrint("ext2fs:%s:%d: Disk io failed\n", __FILE__, __LINE__);
- return(FALSE);
- }
-
- offset = (*StartIndex)%BLOCKSIZE;
- while (offset < BLOCKSIZE)
- {
- current = &buffer[offset];
-
- strncpy(name,current->name,current->name_len);
- name[current->name_len]=0;
-
- DPRINT("Scanning offset %d inode %d name %s\n",
- offset,current->inode,name);
-
- DPRINT("Comparing %s %s\n",name,filename);
- if (strcmp(name,filename)==0 || strcmp(filename,"*")==0)
- {
- DPRINT("Match found\n");
- *StartIndex = (i*BLOCKSIZE) + offset + current->rec_len;
- memcpy(ret,current,sizeof(struct ext2_dir_entry));
- ExFreePool(buffer);
- return(TRUE);
- }
-
- offset = offset + current->rec_len;
- ASSERT(current->rec_len != 0);
- DPRINT("offset %d\n",offset);
- }
- DPRINT("Onto next block\n");
- }
- DPRINT("No match\n");
- ExFreePool(buffer);
- return(FALSE);
-}
-
-void unicode_to_ansi(PCH StringA, PWSTR StringW)
-{
- while((*StringW)!=0)
- {
- *StringA = *StringW;
- StringA++;
- StringW++;
- }
- *StringA = 0;
-}
-
-NTSTATUS Ext2OpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
- PWSTR FileName)
-/*
- * FUNCTION: Opens a file
- */
-{
- EXT2_INODE parent_inode;
- struct ext2_dir_entry entry;
- char name[255];
- ULONG current_inode = 2;
- char* current_segment;
- PEXT2_FCB Fcb;
- ULONG StartIndex = 0;
-
- DPRINT("Ext2OpenFile(DeviceExt %x, FileObject %x, FileName %S)\n",
- DeviceExt,FileObject,FileName);
-
- Fcb = ExAllocatePool(NonPagedPool, sizeof(EXT2_FCB));
-
- unicode_to_ansi(name,FileName);
- DPRINT("name %s\n",name);
- DPRINT("strtok %x\n",strtok);
- current_segment = strtok(name,"\\");
- DPRINT("current_segment %x\n", current_segment);
- while (current_segment!=NULL)
- {
- Ext2LoadInode(DeviceExt,
- current_inode,
- &parent_inode);
- if (!Ext2ScanDir(DeviceExt,
- parent_inode.inode,
- current_segment,
- &entry,
- &StartIndex))
- {
- Ext2ReleaseInode(DeviceExt,
- &parent_inode);
- ExFreePool(Fcb);
- return(STATUS_UNSUCCESSFUL);
- }
- current_inode = entry.inode;
- current_segment = strtok(NULL,"\\");
- StartIndex = 0;
- Ext2ReleaseInode(DeviceExt,
- &parent_inode);
- }
- DPRINT("Found file\n");
-
- Fcb->inode = current_inode;
- CcRosInitializeFileCache(FileObject, &Fcb->Bcb, PAGE_SIZE*3);
- FileObject->FsContext = Fcb;
-
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS STDCALL
-Ext2Create(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PFILE_OBJECT FileObject = Stack->FileObject;
- NTSTATUS Status;
- PDEVICE_EXTENSION DeviceExt;
-
- DPRINT("Ext2Create(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
-
- DeviceExt = DeviceObject->DeviceExtension;
- Status = Ext2OpenFile(DeviceExt,FileObject,FileObject->FileName.Buffer);
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
+++ /dev/null
-#include <ntddk.h>
-#include <ntifs.h>
-
-BOOLEAN Ext2ReadSectors(IN PDEVICE_OBJECT pDeviceObject,
- IN ULONG DiskSector,
- IN ULONG SectorCount,
- IN PVOID Buffer);
-
-#define BLOCKSIZE (1024)
-
-struct ext2_super_block {
- ULONG s_inodes_count; /* Inodes count */
- ULONG s_blocks_count; /* Blocks count */
- ULONG s_r_blocks_count; /* Reserved blocks count */
- ULONG s_free_blocks_count; /* Free blocks count */
- ULONG s_free_inodes_count; /* Free inodes count */
- ULONG s_first_data_block; /* First Data Block */
- ULONG s_log_block_size; /* Block size */
- LONG s_log_frag_size; /* Fragment size */
- ULONG s_blocks_per_group; /* # Blocks per group */
- ULONG s_frags_per_group; /* # Fragments per group */
- ULONG s_inodes_per_group; /* # Inodes per group */
- ULONG s_mtime; /* Mount time */
- ULONG s_wtime; /* Write time */
- USHORT s_mnt_count; /* Mount count */
- SHORT s_max_mnt_count; /* Maximal mount count */
- USHORT s_magic; /* Magic signature */
- USHORT s_state; /* File system state */
- USHORT s_errors; /* Behaviour when detecting errors */
- USHORT s_minor_rev_level; /* minor revision level */
- ULONG s_lastcheck; /* time of last check */
- ULONG s_checkinterval; /* max. time between checks */
- ULONG s_creator_os; /* OS */
- ULONG s_rev_level; /* Revision level */
- USHORT s_def_resuid; /* Default uid for reserved blocks */
- USHORT s_def_resgid; /* Default gid for reserved blocks */
- /*
- * These fields are for EXT2_DYNAMIC_REV superblocks only.
- *
- * Note: the difference between the compatible feature set and
- * the incompatible feature set is that if there is a bit set
- * in the incompatible feature set that the kernel doesn't
- * know about, it should refuse to mount the filesystem.
- *
- * e2fsck's requirements are more strict; if it doesn't know
- * about a feature in either the compatible or incompatible
- * feature set, it must abort and not try to meddle with
- * things it doesn't understand...
- */
- ULONG s_first_ino; /* First non-reserved inode */
- USHORT s_inode_size; /* size of inode structure */
- USHORT s_block_group_nr; /* block group # of this superblock */
- ULONG s_feature_compat; /* compatible feature set */
- ULONG s_feature_incompat; /* incompatible feature set */
- ULONG s_feature_ro_compat; /* readonly-compatible feature set */
- ULONG s_reserved[230]; /* Padding to the end of the block */
-};
-
-/*
- * Codes for operating systems
- */
-#define EXT2_OS_LINUX 0
-#define EXT2_OS_HURD 1
-#define EXT2_OS_MASIX 2
-#define EXT2_OS_FREEBSD 3
-#define EXT2_OS_LITES 4
-
-/*
- * Revision levels
- */
-#define EXT2_GOOD_OLD_REV 0 /* The good old (original) format */
-#define EXT2_DYNAMIC_REV 1 /* V2 format w/ dynamic inode sizes */
-
-#define EXT2_CURRENT_REV EXT2_GOOD_OLD_REV
-#define EXT2_MAX_SUPP_REV EXT2_DYNAMIC_REV
-
-/*
- * The second extended file system magic number
- */
-#define EXT2_SUPER_MAGIC 0xEF53
-
-/*
- * Constants relative to the data blocks
- */
-#define EXT2_NDIR_BLOCKS 12
-#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
-#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
-#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
-#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
-
-
-/*
- * Structure of an inode on the disk
- */
-struct ext2_inode {
- USHORT i_mode; /* File mode */
- USHORT i_uid; /* Owner Uid */
- ULONG i_size; /* Size in bytes */
- ULONG i_atime; /* Access time */
- ULONG i_ctime; /* Creation time */
- ULONG i_mtime; /* Modification time */
- ULONG i_dtime; /* Deletion Time */
- USHORT i_gid; /* Group Id */
- USHORT i_links_count; /* Links count */
- ULONG i_blocks; /* Blocks count */
- ULONG i_flags; /* File flags */
- union {
- struct {
- ULONG l_i_reserved1;
- } linux1;
- struct {
- ULONG h_i_translator;
- } hurd1;
- struct {
- ULONG m_i_reserved1;
- } masix1;
- } osd1; /* OS dependent 1 */
- ULONG i_block[EXT2_N_BLOCKS];/* Pointers to blocks */
- ULONG i_version; /* File version (for NFS) */
- ULONG i_file_acl; /* File ACL */
- ULONG i_dir_acl; /* Directory ACL */
- ULONG i_faddr; /* Fragment address */
- union {
- struct {
- UCHAR l_i_frag; /* Fragment number */
- UCHAR l_i_fsize; /* Fragment size */
- USHORT i_pad1;
- ULONG l_i_reserved2[2];
- } linux2;
- struct {
- UCHAR h_i_frag; /* Fragment number */
- UCHAR h_i_fsize; /* Fragment size */
- USHORT h_i_mode_high;
- USHORT h_i_uid_high;
- USHORT h_i_gid_high;
- ULONG h_i_author;
- } hurd2;
- struct {
- UCHAR m_i_frag; /* Fragment number */
- UCHAR m_i_fsize; /* Fragment size */
- USHORT m_pad1;
- ULONG m_i_reserved2[2];
- } masix2;
- } osd2; /* OS dependent 2 */
-};
-
-#if defined(__KERNEL__) || defined(__linux__)
-#define i_reserved1 osd1.linux1.l_i_reserved1
-#define i_frag osd2.linux2.l_i_frag
-#define i_fsize osd2.linux2.l_i_fsize
-#define i_reserved2 osd2.linux2.l_i_reserved2
-#endif
-
-#ifdef __hurd__
-#define i_translator osd1.hurd1.h_i_translator
-#define i_frag osd2.hurd2.h_i_frag;
-#define i_fsize osd2.hurd2.h_i_fsize;
-#define i_uid_high osd2.hurd2.h_i_uid_high
-#define i_gid_high osd2.hurd2.h_i_gid_high
-#define i_author osd2.hurd2.h_i_author
-#endif
-
-#ifdef __masix__
-#define i_reserved1 osd1.masix1.m_i_reserved1
-#define i_frag osd2.masix2.m_i_frag
-#define i_fsize osd2.masix2.m_i_fsize
-#define i_reserved2 osd2.masix2.m_i_reserved2
-#endif
-
-/*
- * Constants relative to the data blocks
- */
-#define EXT2_NDIR_BLOCKS 12
-#define EXT2_IND_BLOCK EXT2_NDIR_BLOCKS
-#define EXT2_DIND_BLOCK (EXT2_IND_BLOCK + 1)
-#define EXT2_TIND_BLOCK (EXT2_DIND_BLOCK + 1)
-#define EXT2_N_BLOCKS (EXT2_TIND_BLOCK + 1)
-
-/*
- * Inode flags
- */
-#define EXT2_SECRM_FL 0x00000001 /* Secure deletion */
-#define EXT2_UNRM_FL 0x00000002 /* Undelete */
-#define EXT2_COMPR_FL 0x00000004 /* Compress file */
-#define EXT2_SYNC_FL 0x00000008 /* Synchronous updates */
-#define EXT2_IMMUTABLE_FL 0x00000010 /* Immutable file */
-#define EXT2_APPEND_FL 0x00000020 /* writes to file may only append */
-#define EXT2_NODUMP_FL 0x00000040 /* do not dump file */
-#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */
-
-
-/*
- * Structure of a blocks group descriptor
- */
-struct ext2_group_desc
-{
- ULONG bg_block_bitmap; /* Blocks bitmap block */
- ULONG bg_inode_bitmap; /* Inodes bitmap block */
- ULONG bg_inode_table; /* Inodes table block */
- USHORT bg_free_blocks_count; /* Free blocks count */
- USHORT bg_free_inodes_count; /* Free inodes count */
- USHORT bg_used_dirs_count; /* Directories count */
- USHORT bg_pad;
- ULONG bg_reserved[3];
-};
-
-#define EXT2_NAME_LEN 255
-
-struct ext2_dir_entry {
- ULONG inode; /* Inode number */
- USHORT rec_len; /* Directory entry length */
- USHORT name_len; /* Name length */
- char name[EXT2_NAME_LEN]; /* File name */
-};
-
-typedef struct
-{
- PDEVICE_OBJECT StorageDevice;
- struct ext2_super_block* superblock;
- PFILE_OBJECT FileObject;
- PBCB Bcb;
-} DEVICE_EXTENSION, *PDEVICE_EXTENSION;
-
-typedef struct _EXT2_GROUP_DESC
-{
- ERESOURCE Lock;
- struct ext2_group_desc* desc;
- PCACHE_SEGMENT CacheSeg;
- PVOID BaseAddress;
-} EXT2_GROUP_DESC, *PEXT2_GROUP_DESC;
-
-PEXT2_GROUP_DESC Ext2LoadGroup(PDEVICE_EXTENSION DeviceExt,
- ULONG BlockGrp);
-VOID Ext2ReleaseGroup(PDEVICE_EXTENSION DeviceExt,
- PEXT2_GROUP_DESC GrpDesc);
-
-VOID Ext2ReadInode(PDEVICE_EXTENSION DeviceExt,
- ULONG ino,
- struct ext2_inode* inode);
-struct ext2_group_desc* Ext2LoadGroupDesc(PDEVICE_EXTENSION DeviceExt,
- ULONG block_group);
-
-typedef struct _EXT2_INODE
-{
- struct ext2_inode* inode;
- PVOID BaseAddress;
- PCACHE_SEGMENT CacheSeg;
-} EXT2_INODE, *PEXT2_INODE;
-
-typedef struct _EXT2_FCB
-{
- ULONG inode;
- EXT2_INODE i;
- PBCB Bcb;
-} EXT2_FCB, *PEXT2_FCB;
-
-ULONG Ext2BlockMap(PDEVICE_EXTENSION DeviceExt,
- struct ext2_inode* inode,
- ULONG offset);
-NTSTATUS Ext2OpenFile(PDEVICE_EXTENSION DeviceExt, PFILE_OBJECT FileObject,
- PWSTR FileName);
-NTSTATUS Ext2ReadFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PVOID Buffer,
- ULONG Length,
- LARGE_INTEGER Offset);
-NTSTATUS STDCALL Ext2Create(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2DirectoryControl(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2QueryQuota(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2SetQuota(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2SetSecurity(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2QuerySecurity(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2SetInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2QueryInformation(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2Read(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2Write(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2Cleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2FlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS STDCALL Ext2Shutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp);
-NTSTATUS Ext2ReadPage(PDEVICE_EXTENSION DeviceExt,
- PEXT2_FCB Fcb,
- PVOID Buffer,
- ULONG Offset);
-VOID Ext2LoadInode(PDEVICE_EXTENSION DeviceExt,
- ULONG ino,
- PEXT2_INODE Inode);
-VOID Ext2ReleaseInode(PDEVICE_EXTENSION DeviceExt,
- PEXT2_INODE Inode);
-
+++ /dev/null
-/* $Id$ */
-
-#define REACTOS_VERSION_DLL
-#define REACTOS_STR_FILE_DESCRIPTION "Linux ext2 IFS Driver\0"
-#define REACTOS_STR_INTERNAL_NAME "ext2fs\0"
-#define REACTOS_STR_ORIGINAL_FILENAME "ext2fs.sys\0"
-#include <reactos/version.rc>
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/super.c
- * PURPOSE: ext2 filesystem
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-
-#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ****************************************************************/
-
-#define addr_per_block (BLOCKSIZE / sizeof(ULONG))
-
-ULONG Ext2BlockMap(PDEVICE_EXTENSION DeviceExt,
- struct ext2_inode* inode,
- ULONG offset)
-{
- ULONG block;
- PULONG TempBuffer;
- BOOL b;
-
- DPRINT("Ext2BlockMap(DeviceExt %x, inode %x, offset %d)\n",
- DeviceExt,inode,offset);
- if (offset < EXT2_NDIR_BLOCKS)
- {
- block = inode->i_block[offset];
- DPRINT("block %d\n",block);
- return(block);
- }
- offset = offset - EXT2_NDIR_BLOCKS;
- if (offset < addr_per_block)
- {
- block = inode->i_block[EXT2_IND_BLOCK];
- TempBuffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
- b = Ext2ReadSectors(DeviceExt->StorageDevice,
- block,
- 1,
- TempBuffer);
- if (!b)
- {
- DbgPrint("ext2fs:%s:%d: Disk io failed\n", __FILE__, __LINE__);
- return(0);
- }
- block = TempBuffer[offset];
- ExFreePool(TempBuffer);
- return(block);
- }
- offset = offset - addr_per_block;
- DbgPrint("Failed at %s:%d\n",__FILE__,__LINE__);
- for(;;);
-}
-
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/inode.c
- * PURPOSE: Manipulating inodes
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- * 26/12/98: Created
- */
-
-/* INCLUDES ****************************************************************/
-
-#include <ntddk.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ***************************************************************/
-
-struct ext2_group_desc* Ext2LoadGroupDesc(PDEVICE_EXTENSION DeviceExt,
- ULONG block_group)
-{
- struct ext2_group_desc* buffer;
- ULONG block;
- struct ext2_group_desc* gdp;
-
- buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
-
- block = block_group / (BLOCKSIZE / sizeof(struct ext2_group_desc));
-
- Ext2ReadSectors(DeviceExt->StorageDevice,
- 2 + block,
- 1,
- buffer);
-
- gdp = &buffer[block_group % (BLOCKSIZE / sizeof(struct ext2_group_desc))];
-
- DPRINT("gdp->bg_free_blocks_count %d\n",gdp->bg_free_blocks_count);
- DPRINT("gdp->bg_inode_table %d\n",gdp->bg_inode_table);
-
- return(gdp);
-
-}
-
-#define INODES_PER_PAGE (PAGE_SIZE / sizeof(struct ext2_inode))
-#define INODES_PER_BLOCK (BLOCKSIZE / sizeof(struct ext2_inode))
-
-VOID Ext2LoadInode(PDEVICE_EXTENSION DeviceExt,
- ULONG ino,
- PEXT2_INODE Inode)
-{
- ULONG block_group;
- struct ext2_group_desc* gdp;
- ULONG offset;
- ULONG dsec;
- BOOLEAN Uptodate;
- struct ext2_inode* ibuffer;
-
- DPRINT("Ext2LoadInode(DeviceExt %x, ino %d, Inode %x)\n",
- DeviceExt, ino, Inode);
-
- block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
-
- DPRINT("block_group %d\n",block_group);
-
- gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
-
- offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
-
- DPRINT("offset %d\n", offset);
-
- dsec = (gdp->bg_inode_table + (offset / INODES_PER_BLOCK)) * BLOCKSIZE;
-
- DPRINT("dsec %d (dsec/BLOCKSIZE) %d PAGE_ROUND_DOWN(dsec) %d\n",
- dsec, (dsec/BLOCKSIZE), PAGE_ROUND_DOWN(dsec));
-
- CcRequestCachePage(DeviceExt->Bcb,
- PAGE_ROUND_DOWN(dsec),
- &Inode->BaseAddress,
- &Uptodate,
- &Inode->CacheSeg);
- DPRINT("PAGE_ROUND_DOWN(dsec)/BLOCKSIZE %d\n",
- PAGE_ROUND_DOWN(dsec)/BLOCKSIZE);
- if (!Uptodate)
- {
- Ext2ReadSectors(DeviceExt->StorageDevice,
- PAGE_ROUND_DOWN(dsec) / BLOCKSIZE,
- 4,
- Inode->BaseAddress);
- }
- ibuffer = ((struct ext2_inode *)Inode->BaseAddress) +
- (dsec - PAGE_ROUND_DOWN(dsec));
- DPRINT("Inode->BaseAddress 0x%x ibuffer 0x%x\n",
- Inode->BaseAddress, ibuffer);
- Inode->inode = &ibuffer[offset % INODES_PER_PAGE];
-
- DPRINT("inode->i_uid %d\n",Inode->inode->i_uid);
- DPRINT("inode->i_links_count %d\n",Inode->inode->i_links_count);
- DPRINT("inode->i_blocks %d\n",Inode->inode->i_blocks);
-
- DPRINT("Ext2LoadInode() finished\n");
-}
-
-VOID Ext2ReleaseInode(PDEVICE_EXTENSION DeviceExt,
- PEXT2_INODE Inode)
-{
- CcReleaseCachePage(DeviceExt->Bcb,
- Inode->CacheSeg,
- TRUE);
- Inode->CacheSeg = NULL;
- Inode->BaseAddress = NULL;
- Inode->inode = NULL;
-}
-
-VOID Ext2ReadInode(PDEVICE_EXTENSION DeviceExt,
- ULONG ino,
- struct ext2_inode* inode)
-{
- ULONG block_group;
- struct ext2_group_desc* gdp;
- ULONG offset;
- struct ext2_inode* buffer;
-
- DPRINT("Ext2ReadInode(DeviceExt %x, ino %d, inode %x)\n",
- DeviceExt,ino,inode);
-
- block_group = (ino - 1) / DeviceExt->superblock->s_inodes_per_group;
-
- gdp = Ext2LoadGroupDesc(DeviceExt, block_group);
-
-
-
- offset = (ino - 1) % DeviceExt->superblock->s_inodes_per_group;
-
- buffer = ExAllocatePool(NonPagedPool, BLOCKSIZE);
- Ext2ReadSectors(DeviceExt->StorageDevice,
- gdp->bg_inode_table + (offset / INODES_PER_BLOCK),
- 1,
- buffer);
- memcpy(inode,&buffer[offset % INODES_PER_BLOCK],sizeof(struct ext2_inode));
-
- DPRINT("inode->i_uid %d\n",inode->i_uid);
- DPRINT("inode->i_links_count %d\n",inode->i_links_count);
- DPRINT("inode->i_blocks %d\n",inode->i_blocks);
-
-}
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/quota.c
- * PURPOSE: Quota support
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-#include <wchar.h>
-#include <string.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS STDCALL
-Ext2QueryQuota(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- NTSTATUS Status;
-
- Status = STATUS_NOT_IMPLEMENTED;
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
-
-NTSTATUS STDCALL
-Ext2SetQuota(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- NTSTATUS Status;
-
- Status = STATUS_NOT_IMPLEMENTED;
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/super.c
- * PURPOSE: ext2 filesystem
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-#include <string.h>
-
-#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS *****************************************************************/
-
-NTSTATUS Ext2ReadPage(PDEVICE_EXTENSION DeviceExt,
- PEXT2_FCB Fcb,
- PVOID Buffer,
- ULONG Offset)
-{
- ULONG block, i;
-
- for (i=0; i<4; i++)
- {
- block = Ext2BlockMap(DeviceExt,
- Fcb->i.inode,
- Offset + i);
- Ext2ReadSectors(DeviceExt->StorageDevice,
- block,
- 1,
- Buffer + (i*BLOCKSIZE));
- }
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS Ext2ReadFile(PDEVICE_EXTENSION DeviceExt,
- PFILE_OBJECT FileObject,
- PVOID Buffer,
- ULONG Length,
- LARGE_INTEGER OffsetL)
-{
- PVOID BaseAddress;
- BOOLEAN Uptodate = FALSE;
- PCACHE_SEGMENT CacheSeg;
- ULONG Offset = (ULONG)OffsetL.u.LowPart;
- PEXT2_FCB Fcb;
- ULONG block, i, Delta;
- DPRINT("Ext2ReadFile(DeviceExt %x, FileObject %x, Buffer %x, Length %d, \n"
- "OffsetL %d)\n",DeviceExt,FileObject,Buffer,Length,(ULONG)OffsetL);
-
- Fcb = (PEXT2_FCB)FileObject->FsContext;
-
- Ext2LoadInode(DeviceExt,
- Fcb->inode,
- &Fcb->i);
-
- if (Offset >= Fcb->i.inode->i_size)
- {
- DPRINT("Returning end of file\n");
- return(STATUS_END_OF_FILE);
- }
- if ((Offset + Length) > Fcb->i.inode->i_size)
- {
- Length = Fcb->i.inode->i_size - Offset;
- }
-
- Ext2ReleaseInode(DeviceExt,
- &Fcb->i);
-
- if ((Offset % PAGE_SIZE) != 0)
- {
- Delta = min(PAGE_SIZE - (Offset % PAGE_SIZE),Length);
- CcRequestCachePage(Fcb->Bcb,
- Offset,
- &BaseAddress,
- &Uptodate,
- &CacheSeg);
- if (Uptodate == FALSE)
- {
- Ext2ReadPage(DeviceExt,
- Fcb,
- BaseAddress,
- Offset / BLOCKSIZE);
- }
- memcpy(Buffer, BaseAddress + (Offset % PAGE_SIZE), Delta);
- CcReleaseCachePage(Fcb->Bcb,
- CacheSeg,
- TRUE);
- Length = Length - Delta;
- Offset = Offset + Delta;
- Buffer = Buffer + Delta;
- }
- CHECKPOINT;
- for (i=0; i<(Length/PAGE_SIZE); i++)
- {
- CcRequestCachePage(Fcb->Bcb,
- Offset,
- &BaseAddress,
- &Uptodate,
- &CacheSeg);
- if (Uptodate == FALSE)
- {
- Ext2ReadPage(DeviceExt,
- Fcb,
- BaseAddress,
- (Offset / BLOCKSIZE));
- }
- memcpy(Buffer, BaseAddress, PAGE_SIZE);
- CcReleaseCachePage(Fcb->Bcb,
- CacheSeg,
- TRUE);
- Length = Length - PAGE_SIZE;
- Offset = Offset + PAGE_SIZE;
- Buffer = Buffer + PAGE_SIZE;
- }
- CHECKPOINT;
- if ((Length % PAGE_SIZE) != 0)
- {
- CcRequestCachePage(Fcb->Bcb,
- Offset,
- &BaseAddress,
- &Uptodate,
- &CacheSeg);
- if (Uptodate == FALSE)
- {
- Ext2ReadPage(DeviceExt,
- Fcb,
- BaseAddress,
- (Offset / BLOCKSIZE));
- }
- DPRINT("Copying %x to %x Length %d\n",BaseAddress,Buffer,Length);
- memcpy(Buffer,BaseAddress,Length);
- CcReleaseCachePage(Fcb->Bcb,
- CacheSeg,
- TRUE);
- }
- CHECKPOINT;
-
- return(STATUS_SUCCESS);
-}
-
-
-NTSTATUS STDCALL
-Ext2Write(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2Write(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
- Irp->IoStatus.Information = 0;
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2FlushBuffers(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2FlushBuffers(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2Shutdown(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2Shutdown(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2Cleanup(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DbgPrint("Ext2Cleanup(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
-
- DbgPrint("Ext2Cleanup() finished\n");
-
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2Read(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- ULONG Length;
- PVOID Buffer;
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PFILE_OBJECT FileObject = Stack->FileObject;
- PDEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
- NTSTATUS Status;
-
- DPRINT("Ext2Read(DeviceObject %x, FileObject %x, Irp %x)\n",
- DeviceObject, FileObject, Irp);
-
- Length = Stack->Parameters.Read.Length;
- CHECKPOINT;
- Buffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
- CHECKPOINT;
- CHECKPOINT;
-
- Status = Ext2ReadFile(DeviceExt,FileObject,Buffer,Length,
- Stack->Parameters.Read.ByteOffset);
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = Length;
- IoCompleteRequest(Irp,IO_NO_INCREMENT);
-
- return(Status);
-}
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/security.c
- * PURPOSE: Security support
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-#include <wchar.h>
-#include <string.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS STDCALL
-Ext2QuerySecurity(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2QuerySecurity(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
- return(STATUS_UNSUCCESSFUL);
-}
-
-NTSTATUS STDCALL
-Ext2SetSecurity(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- DPRINT("Ext2SetSecurity(DeviceObject %x Irp %x)\n",DeviceObject,Irp);
-
- Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED;
- Irp->IoStatus.Information = 0;
- return(STATUS_UNSUCCESSFUL);
-}
+++ /dev/null
-/*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: services/fs/ext2/super.c
- * PURPOSE: ext2 filesystem
- * PROGRAMMER: David Welch (welch@mcmail.com)
- * UPDATE HISTORY:
- */
-
-/* INCLUDES *****************************************************************/
-
-#include <ntddk.h>
-
-//#define NDEBUG
-#include <debug.h>
-
-#include "ext2fs.h"
-
-/* GLOBALS *****************************************************************/
-
-static PDRIVER_OBJECT DriverObject;
-
-/* FUNCTIONS ****************************************************************/
-
-NTSTATUS STDCALL
-Ext2Close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- PDEVICE_EXTENSION DeviceExtension;
- NTSTATUS Status;
- PEXT2_FCB Fcb;
-
- DbgPrint("Ext2Close(DeviceObject %x, Irp %x)\n",DeviceObject,Irp);
-
- Stack = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Stack->FileObject;
- DeviceExtension = DeviceObject->DeviceExtension;
-
- if (FileObject == DeviceExtension->FileObject)
- {
- Status = STATUS_SUCCESS;
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
- }
-
- Fcb = (PEXT2_FCB)FileObject->FsContext;
- if (Fcb != NULL)
- {
- if (Fcb->Bcb != NULL)
- {
- CcRosReleaseFileCache(FileObject, Fcb->Bcb);
- }
- ExFreePool(Fcb);
- FileObject->FsContext = NULL;
- }
-
- Status = STATUS_SUCCESS;
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
-
-NTSTATUS Ext2Mount(PDEVICE_OBJECT DeviceToMount)
-{
- PDEVICE_OBJECT DeviceObject;
- PDEVICE_EXTENSION DeviceExt;
- PVOID BlockBuffer;
- struct ext2_super_block* superblock;
-
- DPRINT("Ext2Mount(DeviceToMount %x)\n",DeviceToMount);
-
- BlockBuffer = ExAllocatePool(NonPagedPool,BLOCKSIZE);
- Ext2ReadSectors(DeviceToMount,
- 1,
- 1,
- BlockBuffer);
- superblock = BlockBuffer;
-
- if (superblock->s_magic != EXT2_SUPER_MAGIC)
- {
- ExFreePool(BlockBuffer);
- return(STATUS_UNRECOGNIZED_VOLUME);
- }
- DPRINT("Volume recognized\n");
- DPRINT("s_inodes_count %d\n",superblock->s_inodes_count);
- DPRINT("s_blocks_count %d\n",superblock->s_blocks_count);
-
- IoCreateDevice(DriverObject,
- sizeof(DEVICE_EXTENSION),
- NULL,
- FILE_DEVICE_FILE_SYSTEM,
- 0,
- FALSE,
- &DeviceObject);
- DPRINT("DeviceObject %x\n",DeviceObject);
- DeviceObject->Flags = DeviceObject->Flags | DO_DIRECT_IO;
- DeviceExt = (PVOID)DeviceObject->DeviceExtension;
- DPRINT("DeviceExt %x\n",DeviceExt);
-
- DeviceExt->StorageDevice = DeviceToMount;
- DeviceExt->StorageDevice->Vpb->DeviceObject = DeviceObject;
- DeviceExt->StorageDevice->Vpb->RealDevice = DeviceExt->StorageDevice;
- DeviceExt->StorageDevice->Vpb->Flags |= VPB_MOUNTED;
- DeviceObject->StackSize = DeviceExt->StorageDevice->StackSize + 1;
- DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
-
- DPRINT("DeviceExt->StorageDevice %x\n", DeviceExt->StorageDevice);
- DeviceExt->FileObject = IoCreateStreamFileObject(NULL, DeviceObject);
- DeviceExt->superblock = superblock;
- CcRosInitializeFileCache(DeviceExt->FileObject,
- &DeviceExt->Bcb,
- PAGE_SIZE * 3);
-
- DPRINT("Ext2Mount() = STATUS_SUCCESS\n");
-
- return(STATUS_SUCCESS);
-}
-
-NTSTATUS STDCALL
-Ext2FileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
-{
- PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
- PVPB vpb = Stack->Parameters.Mount.Vpb;
- PDEVICE_OBJECT DeviceToMount = Stack->Parameters.Mount.DeviceObject;
- NTSTATUS Status;
-
- Status = Ext2Mount(DeviceToMount);
-
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return(Status);
-}
-
-NTSTATUS STDCALL
-DriverEntry(PDRIVER_OBJECT _DriverObject,
- PUNICODE_STRING RegistryPath)
-/*
- * FUNCTION: Called by the system to initalize the driver
- * ARGUMENTS:
- * DriverObject = object describing this driver
- * RegistryPath = path to our configuration entries
- * RETURNS: Success or failure
- */
-{
- PDEVICE_OBJECT DeviceObject;
- NTSTATUS ret;
- UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\Ext2Fsd");
-
- DbgPrint("Ext2 FSD 0.0.1\n");
-
- DriverObject = _DriverObject;
-
- ret = IoCreateDevice(DriverObject,
- 0,
- &DeviceName,
- FILE_DEVICE_FILE_SYSTEM,
- 0,
- FALSE,
- &DeviceObject);
- if (ret!=STATUS_SUCCESS)
- {
- return(ret);
- }
-
- DeviceObject->Flags=0;
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ext2Close;
- DriverObject->MajorFunction[IRP_MJ_CREATE] = Ext2Create;
- DriverObject->MajorFunction[IRP_MJ_READ] = Ext2Read;
- DriverObject->MajorFunction[IRP_MJ_WRITE] = Ext2Write;
- DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] =
- Ext2FileSystemControl;
- DriverObject->MajorFunction[IRP_MJ_DIRECTORY_CONTROL] =
- Ext2DirectoryControl;
- DriverObject->MajorFunction[IRP_MJ_QUERY_INFORMATION] =
- Ext2QueryInformation;
- DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = Ext2SetInformation;
- DriverObject->MajorFunction[IRP_MJ_FLUSH_BUFFERS] = Ext2FlushBuffers;
- DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = Ext2Shutdown;
- DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Ext2Cleanup;
- DriverObject->MajorFunction[IRP_MJ_QUERY_SECURITY] = Ext2QuerySecurity;
- DriverObject->MajorFunction[IRP_MJ_SET_SECURITY] = Ext2SetSecurity;
- DriverObject->MajorFunction[IRP_MJ_QUERY_QUOTA] = Ext2QueryQuota;
- DriverObject->MajorFunction[IRP_MJ_SET_QUOTA] = Ext2SetQuota;
-
- DriverObject->DriverUnload = NULL;
-
- IoRegisterFileSystem(DeviceObject);
-
- return(STATUS_SUCCESS);
-}
-