63 {
"journal", 0, 4096, 8192 },
64 {
"news", 0, 4096, 4096 },
65 {
"largefile", 0, 4096, 1024 * 1024 },
66 {
"largefile4", 0, 4096, 4096 * 1024 },
78 megs = (super->s_blocks_count * (
EXT2_BLOCK_SIZE(super) / 1024) / 1024);
101 super->s_log_frag_size = super->s_log_block_size =
126 static unsigned char *
buf;
140 #define STRIDE_LENGTH 8 145 buf = (
unsigned char *)
149 DPRINT1(
"Mke2fs: while allocating zeroizing buffer");
192 buf = (
unsigned char *)
196 DPRINT1(
"Mke2fs: Out of memory erasing sectors %d-%d\n",
197 sect, sect + nsect - 1);
201 #define BSD_DISKMAGIC (0x82564557UL) 202 #define BSD_MAGICDISK (0x57455682UL) 203 #define BSD_LABEL_OFFSET 64 290 memset(&parent_inode, 0,
sizeof(parent_inode));
301 inode.i_links_count = 2;
373 DPRINT1(
"Mke2fs: while creating root dir");
384 DPRINT1(
"Mke2fs: while setting root inode ownership");
396 char *
name =
"lost+found";
419 Ext2Sys->
umask = 077;
424 DPRINT1(
"Mke2fs: while creating /lost+found.\n");
435 if (lpf_size >= 16*1024)
442 DPRINT1(
"Mke2fs: create_lost_and_found: error alloc block.\n");
449 DPRINT1(
"Mke2fs: errors when expanding /lost+found.\n");
531 unsigned long fs_state;
539 fs_state =
fs->ext2_sb->s_state;
542 fs->ext2_sb->s_block_group_nr = 0;
544 super_shadow =
fs->ext2_sb;
545 group_shadow =
fs->group_desc;
560 if (
fs->ext2_sb->s_feature_incompat &
578 group_block =
fs->ext2_sb->s_first_data_block;
579 maxgroup =
fs->group_desc_count;
581 for (
i = 0;
i < maxgroup;
i++)
587 if (sgrp > ((1 << 16) - 1))
588 sgrp = (1 << 16) - 1;
590 fs->ext2_sb->s_block_group_nr = (
USHORT) sgrp;
605 group_ptr = (
char *) group_shadow;
607 for (
j=0;
j <
fs->desc_blocks;
j++)
613 fs->blocksize, (
PUCHAR) group_ptr));
620 group_ptr +=
fs->blocksize;
628 fs->ext2_sb->s_block_group_nr = 0;
648 fs->ext2_sb->s_state = (
USHORT) fs_state;
663 DPRINT1(
"Mke2fs: ext2_create_journal_dev: while initializing journal superblock.\n");
667 DPRINT(
"Mke2fs: Zeroing journal device: \n");
676 DPRINT1(
"Mke2fs: create_journal_dev: while zeroing journal device (block %lu, count %lu).\n",
684 fs->blocksize, (
unsigned char *)
buf));
688 DPRINT1(
"Mke2fs: create_journal_dev: while writing journal superblock.\n");
695 #define BLOCK_BITS (Ext2Sys->ext2_sb->s_log_block_size + 10) 701 ULONG dwMeta[4] = {0, 0, 0, 0};
702 ULONG DataBlocks = 0;
712 for (
i = 0;
i < 4;
i++)
722 for(
i=1; (
i < 4) && (TotalBlocks > 0);
i++)
724 if (TotalBlocks >= (
dwData[
i] + dwMeta[
i]))
726 TotalBlocks -= (
dwData[
i] + dwMeta[
i]);
734 for (
j=
i; (
j > 0) && (TotalBlocks > 0);
j--)
736 dwDivide = (TotalBlocks - 1) / (
dwData[
j-1] + dwMeta[
j-1]);
737 dwRemain = (TotalBlocks - 1) % (
dwData[
j-1] + dwMeta[
j-1]);
739 DataBlocks += (dwDivide *
dwData[
j-1]);
740 TotalBlocks = dwRemain;
753 ULONG dwMeta[4] = {0, 0, 0, 0};
754 ULONG TotalBlocks = 0;
764 for (
i = 0;
i < 4;
i++)
774 for(
i=1; (
i < 4) && (DataBlocks > 0);
i++)
779 TotalBlocks += (
dwData[
i] + dwMeta[
i]);
786 for (
j=
i; (
j > 0) && (DataBlocks > 0);
j--)
788 dwDivide = (DataBlocks) / (
dwData[
j-1]);
789 dwRemain = (DataBlocks) % (
dwData[
j-1]);
791 TotalBlocks += (dwDivide * (
dwData[
j-1] + dwMeta[
j-1]) + 1);
792 DataBlocks = dwRemain;
841 DPRINT1(
"Mke2fs: Volume %wZ does not exist, ...\n", DriveRoot);
848 DPRINT1(
"Mke2fs: Can't get media information\n");
861 Ext2Sb.s_inodes_count =
867 Ext2Sb.s_r_blocks_count = (Ext2Sb.s_blocks_count * 5) / 100;
905 for (
i = 0,
val = 0 ;
i <
sizeof(Ext2Sb.s_uuid);
i++)
906 val += Ext2Sb.s_uuid[
i];
919 ansi_label.
Buffer = Ext2Sb.s_volume_name;
933 blocks = Ext2Sb.s_blocks_count;
936 DPRINT1(
"Mke2fs: zeroing volume boot record\n");
956 DPRINT1(
"Mke2fs: zeroing block %lu at end of filesystem", ret_blk);
969 DPRINT(
"Mke2fs: Writing superblocks and filesystem accounting information ... \n");
973 DPRINT1(
"Mke2fs: Slow format not supported yet\n");
978 DPRINT1(
"Mke2fs: Warning, had trouble writing out superblocks.\n");
982 DPRINT(
"Mke2fs: Writing superblocks and filesystem accounting information done!\n");
bool ext2_save_inode(PEXT2_FILESYS Ext2Sys, ULONG no, PEXT2_INODE pInode)
static unsigned int block
bool ext2_flush(PEXT2_FILESYS fs)
struct mke2fs_defaults settings[]
static char default_str[]
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
bool write_primary_superblock(PEXT2_FILESYS Ext2Sys, PEXT2_SUPER_BLOCK super)
BOOLEAN NTAPI Ext2Chkdsk(IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN FixErrors, IN BOOLEAN Verbose, IN BOOLEAN CheckOnlyIfDirty, IN BOOLEAN ScanDrive, IN PVOID pUnknown1, IN PVOID pUnknown2, IN PVOID pUnknown3, IN PVOID pUnknown4, IN PULONG ExitStatus)
ULONG Ext2DataBlocks(PEXT2_FILESYS Ext2Sys, ULONG TotalBlocks)
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV
bool ext2_load_inode(PEXT2_FILESYS Ext2Sys, ULONG no, PEXT2_INODE pInode)
bool ext2_add_entry(PEXT2_FILESYS Ext2Sys, ULONG parent, ULONG inode, int filetype, char *name)
#define UNREFERENCED_PARAMETER(P)
GLuint GLuint GLsizei count
NTSTATUS Ext2WriteDisk(PEXT2_FILESYS Ext2Sys, ULONGLONG Offset, ULONG Length, PVOID Buffer)
void ext2_inode_alloc_stats2(PEXT2_FILESYS fs, ULONG ino, int inuse, int isdir)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
NTSTATUS Ext2OpenDevice(PEXT2_FILESYS Ext2Sys, PUNICODE_STRING DeviceName)
NTSTATUS Ext2ReadDisk(IN PEXT2_VCB Vcb, IN ULONGLONG Offset, IN ULONG Size, IN PVOID Buffer, IN BOOLEAN bVerify)
void set_fs_defaults(const char *fs_type, PEXT2_SUPER_BLOCK super, int blocksize, int *inode_ratio)
static HANDLE ULONG_PTR dwData
enum _MEDIA_TYPE MEDIA_TYPE
#define EXT2_GOOD_OLD_REV
NTSTATUS Ext2GetMediaInfo(PEXT2_FILESYS Ext2Sys)
void ext2_free_inode_bitmap(PEXT2_FILESYS Ext2Sys)
void ext2_block_alloc_stats(PEXT2_FILESYS fs, ULONG blk, int inuse)
void ext2_print_super(PEXT2_SUPER_BLOCK pExt2Sb)
GLenum GLuint GLenum GLsizei const GLchar * buf
#define EXT2_DFL_MAX_MNT_COUNT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSTATUS Ext2UnLockVolume(PEXT2_FILESYS Ext2Sys)
bool ext2_expand_inode(PEXT2_FILESYS Ext2Sys, PEXT2_INODE Inode, ULONG newBlk)
void ext2_update_dynamic_rev(PEXT2_FILESYS fs)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
bool ext2_initialize_sb(PEXT2_FILESYS pExt2Sys)
bool ext2_allocate_tables(PEXT2_FILESYS Ext2Sys)
#define EXT2_FEATURE_INCOMPAT_FILETYPE
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
static WCHAR no[MAX_STRING_RESOURCE_LEN]
bool zap_sector(PEXT2_FILESYS Ext2Sys, int sect, int nsect)
void ext2_free_block_bitmap(PEXT2_FILESYS Ext2Sys)
bool create_lost_and_found(PEXT2_FILESYS Ext2Sys)
bool ext2_write_bitmaps(PEXT2_FILESYS fs)
#define NT_SUCCESS(StatCode)
struct ext2_dirent * PEXT2_DIR_ENTRY
int int_log10(unsigned int arg)
NTSTATUS Ext2LockVolume(IN PEXT2_IRP_CONTEXT IrpContext)
bool ext2_reserve_inodes(PEXT2_FILESYS fs)
NTSTATUS Ext2DisMountVolume(PEXT2_FILESYS Ext2Sys)
#define STATUS_UNSUCCESSFUL
#define SUPERBLOCK_OFFSET
bool ext2_bg_has_super(PEXT2_SUPER_BLOCK pExt2Sb, int group_block)
bool create_bad_block_inode(PEXT2_FILESYS Ext2Sys, PEXT2_BADBLK_LIST bb_list)
BOOLEAN NTAPI Ext2Format(IN PUNICODE_STRING DriveRoot, IN PFMIFSCALLBACK Callback, IN BOOLEAN QuickFormat, IN BOOLEAN BackwardCompatible, IN MEDIA_TYPE MediaType, IN PUNICODE_STRING Label, IN ULONG ClusterSize)
#define memcpy(s1, s2, n)
void ext2_free_group_desc(PEXT2_FILESYS Ext2Sys)
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
bool ext2_mkdir(PEXT2_FILESYS fs, ULONG parent, ULONG inum, char *name, ULONG *no, PEXT2_INODE pid)
bool zero_blocks(PEXT2_FILESYS fs, ULONG blk, ULONG num, ULONG *ret_blk, ULONG *ret_count)
void uuid_generate(__u8 *uuid)
BOOLEAN(NTAPI * PFMIFSCALLBACK)(IN CALLBACKCOMMAND Command, IN ULONG SubAction, IN PVOID ActionInfo)
#define EXT2_BLOCK_SIZE(sb)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
bool ext2_new_block(PEXT2_FILESYS fs, ULONG goal, PEXT2_BLOCK_BITMAP map, ULONG *ret)
ULONG Ext2TotalBlocks(PEXT2_FILESYS Ext2Sys, ULONG DataBlocks)
BOOLEAN NTAPI RtlTimeToSecondsSince1970(PLARGE_INTEGER Time, PULONG ElapsedSeconds)
PARTITION_INFORMATION PartInfo
bool ext2_new_inode(PEXT2_FILESYS fs, ULONG dir, int mode, PEXT2_INODE_BITMAP map, ULONG *ret)
#define EXT2_GOOD_OLD_INODE_SIZE
#define EXT2_GOOD_OLD_FIRST_INO
bool create_root_dir(PEXT2_FILESYS fs)
int strcmp(const char *String1, const char *String2)
#define RtlZeroMemory(Destination, Length)
NTSTATUS NTAPI NtQuerySystemTime(OUT PLARGE_INTEGER SystemTime)
char * cleanup(char *str)
bool ext2_write_block(PEXT2_FILESYS fs, ULONG block, void *inbuf)
bool ext2_new_dir_block(PEXT2_FILESYS fs, ULONG dir_ino, ULONG parent_ino, char **block)
NTSTATUS Ext2CloseDevice(PEXT2_FILESYS Ext2Sys)
#define EXT2_BLOCKS_PER_GROUP(s)
bool create_journal_dev(PEXT2_FILESYS fs)
bool write_inode_tables(PEXT2_FILESYS fs)
#define EXT2_MIN_BLOCK_LOG_SIZE
PEXT2_SUPER_BLOCK ext2_sb
bool ext2_alloc_block(PEXT2_FILESYS fs, ULONG goal, ULONG *ret)