grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Move NTFS compression support to new module ntfscomp


From: Robert Millan
Subject: Re: [PATCH] Move NTFS compression support to new module ntfscomp
Date: Fri, 21 Dec 2007 12:41:48 +0100
User-agent: Mutt/1.5.13 (2006-08-11)

Committed.

On Sat, Dec 15, 2007 at 02:08:22PM +0100, Robert Millan wrote:
> 
> I just tested this with and without the module, on a filesystem with and
> without compression (all 4 combinations) and didn't observe any oddities.
> 
> If nobody objects I'll check this in.
> 
> On Wed, Dec 12, 2007 at 11:56:36PM +0800, Bean wrote:
> > Ok.
> >
> > 2007-12-12  Bean  <address@hidden>
> > 
> >     * conf/common.rmk (pkgdata_MODULES): Add ntfscomp.mod.
> >     (ntfscomp_mod_SOURCES): New variable.
> >     (ntfscomp_mod_CFLAGS): Likewise.
> >     (ntfscomp_mod_LDFLAGS): Likewise.
> > 
> >     * conf/i386-pc.rmk (grub_setup_SOURCES): Add fs/ntfscomp.c.
> >     (grub_probe_SOURCES): Likewise.
> >     (grub_emu_SOURCES): Likewise.
> > 
> >     * conf/i386-efi.rmk (grub_probe_SOURCES): Add fs/ntfscomp.c.
> >     (grub_emu_SOURCES): Likewise.
> > 
> >     * conf/i386-linuxbios.rmk (grub_probe_SOURCES): Add fs/ntfscomp.c.
> >     (grub_emu_SOURCES): Likewise.
> > 
> >     * conf/powerpc-ieee1275.rmk (grub_probe_SOURCES): Add fs/ntfscomp.c.
> >     (grub_emu_SOURCES): Likewise.
> > 
> >     * fs/ntfs.c (grub_ntfscomp_func): New variable.
> >     (read_run_list): Renamed to grub_ntfs_read_run_list.
> >     (decomp_nextvcn): Moved to ntfscomp.c.
> >     (decomp_getch): Likewise.
> >     (decomp_get16): Likewise.
> >     (decomp_block): Likewise.
> >     (read_block): Likewise.
> >     (read_data): Partially moved to ntfscomp.c.
> >     (fixup): Change unsigned to grub_uint16_t.
> >     (read_mft): Change unsigned long to grub_uint32_t.
> >     (read_attr): Likewise.
> >     (read_data): Likewise.
> >     (read_run_data): Likewise.
> >     (read_run_list): Likewise.
> >     (read_mft): Likewise.
> > 
> >     * fs/ntfscomp.c: New file.
> > 
> >     * include/grub/ntfs.h: New file.
> > 
> > 
> > Index: conf/common.rmk
> > ===================================================================
> > RCS file: /sources/grub/grub2/conf/common.rmk,v
> > retrieving revision 1.17
> > diff -u -p -r1.17 common.rmk
> > --- conf/common.rmk 18 Nov 2007 06:41:45 -0000      1.17
> > +++ conf/common.rmk 29 Nov 2007 18:23:10 -0000
> > @@ -81,7 +81,7 @@ update-grub_DATA += util/grub.d/README
> >  # Filing systems.
> >  pkgdata_MODULES += fshelp.mod fat.mod ufs.mod ext2.mod ntfs.mod    \
> >     minix.mod hfs.mod jfs.mod iso9660.mod xfs.mod affs.mod  \
> > -   sfs.mod hfsplus.mod
> > +   sfs.mod hfsplus.mod ntfscomp.mod
> > 
> >  # For fshelp.mod.
> >  fshelp_mod_SOURCES = fs/fshelp.c
> > @@ -108,6 +108,11 @@ ntfs_mod_SOURCES = fs/ntfs.c
> >  ntfs_mod_CFLAGS = $(COMMON_CFLAGS)
> >  ntfs_mod_LDFLAGS = $(COMMON_LDFLAGS)
> > 
> > +# For ntfscomp.mod.
> > +ntfscomp_mod_SOURCES = fs/ntfscomp.c
> > +ntfscomp_mod_CFLAGS = $(COMMON_CFLAGS)
> > +ntfscomp_mod_LDFLAGS = $(COMMON_LDFLAGS)
> > +
> >  # For minix.mod.
> >  minix_mod_SOURCES = fs/minix.c
> >  minix_mod_CFLAGS = $(COMMON_CFLAGS)
> > Index: conf/i386-efi.rmk
> > ===================================================================
> > RCS file: /sources/grub/grub2/conf/i386-efi.rmk,v
> > retrieving revision 1.24
> > diff -u -p -r1.24 i386-efi.rmk
> > --- conf/i386-efi.rmk       18 Nov 2007 06:41:45 -0000      1.24
> > +++ conf/i386-efi.rmk       29 Nov 2007 18:23:11 -0000
> > @@ -36,7 +36,7 @@ grub_probe_SOURCES = util/grub-probe.c    \
> >     partmap/pc.c partmap/apple.c partmap/gpt.c                      \
> >     fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c kern/fs.c       \
> >     kern/env.c fs/fshelp.c fs/xfs.c fs/affs.c fs/sfs.c fs/hfsplus.c \
> > -   disk/lvm.c disk/raid.c grub_probe_init.c
> > +   fs/ntfscomp.c disk/lvm.c disk/raid.c grub_probe_init.c
> > 
> >  # For grub-emu.
> >  grub_emu_DEPENDENCIES = grub_script.tab.c grub_script.tab.h                
> > \
> > @@ -50,7 +50,7 @@ grub_emu_SOURCES = commands/boot.c comma
> >     disk/loopback.c                                                 \
> >     fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c  \
> >     fs/jfs.c fs/minix.c fs/sfs.c fs/ufs.c fs/xfs.c fs/hfsplus.c     \
> > -   fs/ntfs.c                                                       \
> > +   fs/ntfs.c fs/ntfscomp.c                                         \
> >     io/gzio.c                                                       \
> >     kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c       \
> >     kern/err.c                                                      \
> > Index: conf/i386-linuxbios.rmk
> > ===================================================================
> > RCS file: /sources/grub/grub2/conf/i386-linuxbios.rmk,v
> > retrieving revision 1.3
> > diff -u -p -r1.3 i386-linuxbios.rmk
> > --- conf/i386-linuxbios.rmk 18 Nov 2007 06:41:45 -0000      1.3
> > +++ conf/i386-linuxbios.rmk 29 Nov 2007 18:23:14 -0000
> > @@ -60,7 +60,7 @@ grub_probe_SOURCES = util/grub-probe.c    \
> >     partmap/pc.c partmap/apple.c partmap/gpt.c                      \
> >     fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c kern/fs.c       \
> >     kern/env.c fs/fshelp.c fs/xfs.c fs/affs.c fs/sfs.c fs/hfsplus.c \
> > -   disk/lvm.c disk/raid.c grub_probe_init.c
> > +   fs/ntfscomp.c disk/lvm.c disk/raid.c grub_probe_init.c
> > 
> >  # For grub-emu.
> >  grub_emu_DEPENDENCIES = grub_script.tab.c grub_script.tab.h                
> > \
> > @@ -74,7 +74,7 @@ grub_emu_SOURCES = commands/boot.c comma
> >     disk/host.c disk/loopback.c     disk/raid.c disk/lvm.c          \
> >     fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c  \
> >     fs/jfs.c fs/minix.c fs/sfs.c fs/ufs.c fs/xfs.c fs/hfsplus.c     \
> > -   fs/ntfs.c                                                       \
> > +   fs/ntfs.c fs/ntfscomp.c                                         \
> >     io/gzio.c                                                       \
> >     kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c       \
> >     kern/err.c                                                      \
> > Index: conf/i386-pc.rmk
> > ===================================================================
> > RCS file: /sources/grub/grub2/conf/i386-pc.rmk,v
> > retrieving revision 1.94
> > diff -u -p -r1.94 i386-pc.rmk
> > --- conf/i386-pc.rmk        18 Nov 2007 06:41:45 -0000      1.94
> > +++ conf/i386-pc.rmk        29 Nov 2007 18:23:21 -0000
> > @@ -68,7 +68,7 @@ grub_setup_SOURCES = util/i386/pc/grub-s
> >     fs/sfs.c kern/parser.c kern/partition.c partmap/pc.c            \
> >     partmap/gpt.c fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c   \
> >     fs/hfsplus.c kern/file.c kern/fs.c kern/env.c fs/fshelp.c       \
> > -   util/raid.c util/lvm.c grub_setup_init.c
> > +   fs/ntfscomp.c util/raid.c util/lvm.c grub_setup_init.c
> > 
> >  # For grub-mkdevicemap.
> >  grub_mkdevicemap_SOURCES = util/grub-mkdevicemap.c util/misc.c             
> > \
> > @@ -83,7 +83,7 @@ grub_probe_SOURCES = util/grub-probe.c    \
> >     partmap/pc.c partmap/apple.c partmap/gpt.c                      \
> >     fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c kern/fs.c       \
> >     kern/env.c fs/fshelp.c fs/xfs.c fs/affs.c fs/sfs.c fs/hfsplus.c \
> > -   disk/lvm.c disk/raid.c grub_probe_init.c
> > +   fs/ntfscomp.c disk/lvm.c disk/raid.c grub_probe_init.c
> > 
> >  # For grub-emu.
> >  grub_emu_DEPENDENCIES = grub_script.tab.c grub_script.tab.h                
> > \
> > @@ -97,7 +97,7 @@ grub_emu_SOURCES = commands/boot.c comma
> >     disk/host.c disk/loopback.c     disk/raid.c disk/lvm.c          \
> >     fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c  \
> >     fs/jfs.c fs/minix.c fs/sfs.c fs/ufs.c fs/xfs.c fs/hfsplus.c     \
> > -   fs/ntfs.c                                                       \
> > +   fs/ntfs.c fs/ntfscomp.c                                         \
> >     io/gzio.c                                                       \
> >     kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c       \
> >     kern/err.c                                                      \
> > Index: conf/powerpc-ieee1275.rmk
> > ===================================================================
> > RCS file: /sources/grub/grub2/conf/powerpc-ieee1275.rmk,v
> > retrieving revision 1.75
> > diff -u -p -r1.75 powerpc-ieee1275.rmk
> > --- conf/powerpc-ieee1275.rmk       18 Nov 2007 06:41:46 -0000      1.75
> > +++ conf/powerpc-ieee1275.rmk       29 Nov 2007 18:23:24 -0000
> > @@ -48,7 +48,7 @@ grub_probe_SOURCES = util/grub-probe.c    \
> >     partmap/pc.c partmap/apple.c partmap/gpt.c                      \
> >     fs/ufs.c fs/minix.c fs/hfs.c fs/jfs.c fs/ntfs.c kern/fs.c       \
> >     kern/env.c fs/fshelp.c fs/xfs.c fs/affs.c fs/sfs.c fs/hfsplus.c \
> > -   disk/lvm.c disk/raid.c grub_probe_init.c
> > +   fs/ntfscomp.c disk/lvm.c disk/raid.c grub_probe_init.c
> > 
> >  # For grub-emu
> >  grub_emu_DEPENDENCIES = grub_script.tab.c grub_script.tab.h                
> > \
> > @@ -61,7 +61,7 @@ grub_emu_SOURCES = commands/boot.c comma
> >     disk/loopback.c                                                 \
> >     fs/affs.c fs/ext2.c fs/fat.c fs/fshelp.c fs/hfs.c fs/iso9660.c  \
> >     fs/jfs.c fs/minix.c fs/sfs.c fs/ufs.c fs/xfs.c fs/hfsplus.c     \
> > -   fs/ntfs.c                                                       \
> > +   fs/ntfs.c fs/ntfscomp.c                                         \
> >     io/gzio.c                                                       \
> >     kern/device.c kern/disk.c kern/dl.c kern/elf.c kern/env.c       \
> >     kern/err.c kern/file.c kern/fs.c kern/loader.c kern/main.c      \
> > Index: fs/ntfs.c
> > ===================================================================
> > RCS file: /sources/grub/grub2/fs/ntfs.c,v
> > retrieving revision 1.2
> > diff -u -p -r1.2 ntfs.c
> > --- fs/ntfs.c       10 Nov 2007 20:08:33 -0000      1.2
> > +++ fs/ntfs.c       29 Nov 2007 18:12:25 -0000
> > @@ -23,169 +23,20 @@
> >  #include <grub/disk.h>
> >  #include <grub/dl.h>
> >  #include <grub/fshelp.h>
> > -
> > -#define FILE_MFT      0
> > -#define FILE_MFTMIRR  1
> > -#define FILE_LOGFILE  2
> > -#define FILE_VOLUME   3
> > -#define FILE_ATTRDEF  4
> > -#define FILE_ROOT     5
> > -#define FILE_BITMAP   6
> > -#define FILE_BOOT     7
> > -#define FILE_BADCLUS  8
> > -#define FILE_QUOTA    9
> > -#define FILE_UPCASE  10
> > -
> > -#define AT_STANDARD_INFORMATION    0x10
> > -#define AT_ATTRIBUTE_LIST  0x20
> > -#define AT_FILENAME                0x30
> > -#define AT_OBJECT_ID               0x40
> > -#define AT_SECURITY_DESCRIPTOR     0x50
> > -#define AT_VOLUME_NAME             0x60
> > -#define AT_VOLUME_INFORMATION      0x70
> > -#define AT_DATA                    0x80
> > -#define AT_INDEX_ROOT              0x90
> > -#define AT_INDEX_ALLOCATION        0xA0
> > -#define AT_BITMAP          0xB0
> > -#define AT_SYMLINK         0xC0
> > -#define AT_EA_INFORMATION  0xD0
> > -#define AT_EA                      0xE0
> > -
> > -#define ATTR_READ_ONLY             0x1
> > -#define ATTR_HIDDEN                0x2
> > -#define ATTR_SYSTEM                0x4
> > -#define ATTR_ARCHIVE               0x20
> > -#define ATTR_DEVICE                0x40
> > -#define ATTR_NORMAL                0x80
> > -#define ATTR_TEMPORARY             0x100
> > -#define ATTR_SPARSE                0x200
> > -#define ATTR_REPARSE               0x400
> > -#define ATTR_COMPRESSED            0x800
> > -#define ATTR_OFFLINE               0x1000
> > -#define ATTR_NOT_INDEXED   0x2000
> > -#define ATTR_ENCRYPTED             0x4000
> > -#define ATTR_DIRECTORY             0x10000000
> > -#define ATTR_INDEX_VIEW            0x20000000
> > -
> > -#define FLAG_COMPRESSED            1
> > -#define FLAG_ENCRYPTED             0x4000
> > -#define FLAG_SPARSE                0x8000
> > -
> > -#define BLK_SHR            GRUB_DISK_SECTOR_BITS
> > -
> > -#define MAX_MFT            (1024 >> BLK_SHR)
> > -#define MAX_IDX            (16384 >> BLK_SHR)
> > -#define MAX_SPC            (4096 >> BLK_SHR)
> > -
> > -#define COM_LEN            4096
> > -#define COM_SEC            (COM_LEN >> BLK_SHR)
> > -
> > -#define BMP_LEN            4096
> > -
> > -#define AF_ALST            1
> > -#define AF_MMFT            2
> > -#define AF_GPOS            4
> > -
> > -#define RF_COMP            1
> > -#define RF_CBLK            2
> > -#define RF_BLNK            4
> > -
> > -#define valueat(buf,ofs,type)      *((type*)(((char*)buf)+ofs))
> > -
> > -#define u16at(buf,ofs)     grub_le_to_cpu16(valueat(buf,ofs,grub_uint16_t))
> > -#define u32at(buf,ofs)     grub_le_to_cpu32(valueat(buf,ofs,grub_uint32_t))
> > -#define u64at(buf,ofs)     grub_le_to_cpu64(valueat(buf,ofs,grub_uint64_t))
> > -
> > -#define v16at(buf,ofs)     valueat(buf,ofs,grub_uint16_t)
> > -#define v32at(buf,ofs)     valueat(buf,ofs,grub_uint32_t)
> > -#define v64at(buf,ofs)     valueat(buf,ofs,grub_uint64_t)
> > -
> > -struct grub_ntfs_bpb
> > -{
> > -  grub_uint8_t jmp_boot[3];
> > -  grub_uint8_t oem_name[8];
> > -  grub_uint16_t bytes_per_sector;
> > -  grub_uint8_t sectors_per_cluster;
> > -  grub_uint8_t reserved_1[7];
> > -  grub_uint8_t media;
> > -  grub_uint16_t reserved_2;
> > -  grub_uint16_t sectors_per_track;
> > -  grub_uint16_t num_heads;
> > -  grub_uint32_t num_hidden_sectors;
> > -  grub_uint32_t reserved_3[2];
> > -  grub_uint64_t num_total_sectors;
> > -  grub_uint64_t mft_lcn;
> > -  grub_uint64_t mft_mirr_lcn;
> > -  grub_int8_t clusters_per_mft;
> > -  grub_int8_t reserved_4[3];
> > -  grub_int8_t clusters_per_index;
> > -  grub_int8_t reserved_5[3];
> > -  grub_uint64_t serial_number;
> > -  grub_uint32_t checksum;
> > -} __attribute__ ((packed));
> > -
> > -#define grub_ntfs_file grub_fshelp_node
> > -
> > -struct grub_ntfs_attr
> > -{
> > -  int flags;
> > -  char *emft_buf, *edat_buf;
> > -  char *attr_cur, *attr_nxt, *attr_end;
> > -  unsigned long save_pos;
> > -  char *sbuf;
> > -  struct grub_ntfs_file *mft;
> > -};
> > -
> > -struct grub_fshelp_node
> > -{
> > -  struct grub_ntfs_data *data;
> > -  char *buf;
> > -  grub_uint32_t size;
> > -  grub_uint32_t ino;
> > -  int inode_read;
> > -  struct grub_ntfs_attr attr;
> > -};
> > -
> > -struct grub_ntfs_data
> > -{
> > -  struct grub_ntfs_file cmft;
> > -  struct grub_ntfs_file mmft;
> > -  grub_disk_t disk;
> > -  grub_uint32_t mft_size;
> > -  grub_uint32_t idx_size;
> > -  grub_uint32_t spc;
> > -  grub_uint32_t blocksize;
> > -  grub_uint32_t mft_start;
> > -};
> > -
> > -struct grub_ntfs_comp
> > -{
> > -  grub_disk_t disk;
> > -  int comp_head, comp_tail;
> > -  unsigned long comp_table[16][2];
> > -  unsigned long cbuf_ofs, cbuf_vcn, spc;
> > -  char *cbuf;
> > -};
> > -
> > -struct grub_ntfs_rlst
> > -{
> > -  int flags;
> > -  unsigned long target_vcn, curr_vcn, next_vcn, curr_lcn;
> > -  char *cur_run;
> > -  struct grub_ntfs_attr *attr;
> > -  struct grub_ntfs_comp comp;
> > -};
> > +#include <grub/ntfs.h>
> > 
> >  #ifndef GRUB_UTIL
> >  static grub_dl_t my_mod;
> >  #endif
> > 
> > +ntfscomp_func_t grub_ntfscomp_func;
> > +
> >  static grub_err_t
> >  fixup (struct grub_ntfs_data *data, char *buf, int len, char *magic)
> >  {
> >    int ss;
> >    char *pu;
> > -  unsigned us;
> > +  grub_uint16_t us;
> > 
> >    if (grub_memcmp (buf, magic, 4))
> >      return grub_error (GRUB_ERR_BAD_FS, "%s label not found", magic);
> > @@ -212,9 +63,9 @@ fixup (struct grub_ntfs_data *data, char
> >  }
> > 
> >  static grub_err_t read_mft (struct grub_ntfs_data *data, char *buf,
> > -                       unsigned long mftno);
> > +                       grub_uint32_t mftno);
> >  static grub_err_t read_attr (struct grub_ntfs_attr *at, char *dest,
> > -                        unsigned long ofs, unsigned long len,
> > +                        grub_uint32_t ofs, grub_uint32_t len,
> >                          int cached,
> >                          void
> >                          NESTED_FUNC_ATTR (*read_hook) (grub_disk_addr_t
> > @@ -223,7 +74,7 @@ static grub_err_t read_attr (struct grub
> >                                                         unsigned length));
> > 
> >  static grub_err_t read_data (struct grub_ntfs_attr *at, char *pa, char 
> > *dest,
> > -                        unsigned long ofs, unsigned long len,
> > +                        grub_uint32_t ofs, grub_uint32_t len,
> >                          int cached,
> >                          void
> >                          NESTED_FUNC_ATTR (*read_hook) (grub_disk_addr_t
> > @@ -413,9 +264,9 @@ locate_attr (struct grub_ntfs_attr *at,
> >  }
> > 
> >  static char *
> > -read_run_data (char *run, int nn, unsigned long *val, int sig)
> > +read_run_data (char *run, int nn, grub_uint32_t * val, int sig)
> >  {
> > -  unsigned long r, v;
> > +  grub_uint32_t r, v;
> > 
> >    r = 0;
> >    v = 1;
> > @@ -433,11 +284,11 @@ read_run_data (char *run, int nn, unsign
> >    return run;
> >  }
> > 
> > -static grub_err_t
> > -read_run_list (struct grub_ntfs_rlst *ctx)
> > +grub_err_t
> > +grub_ntfs_read_run_list (struct grub_ntfs_rlst * ctx)
> >  {
> >    int c1, c2;
> > -  unsigned long val;
> > +  grub_uint32_t val;
> >    char *run;
> > 
> >    run = ctx->cur_run;
> > @@ -482,294 +333,32 @@ retry:
> >    return 0;
> >  }
> > 
> > -static grub_err_t
> > -decomp_nextvcn (struct grub_ntfs_comp *cc)
> > -{
> > -  if (cc->comp_head >= cc->comp_tail)
> > -    return grub_error (GRUB_ERR_BAD_FS, "Compression block overflown");
> > -  if (grub_disk_read
> > -      (cc->disk,
> > -       (cc->comp_table[cc->comp_head][1] -
> > -   (cc->comp_table[cc->comp_head][0] - cc->cbuf_vcn)) * cc->spc, 0,
> > -       cc->spc << BLK_SHR, cc->cbuf))
> > -    return grub_errno;
> > -  cc->cbuf_vcn++;
> > -  if ((cc->cbuf_vcn >= cc->comp_table[cc->comp_head][0]))
> > -    cc->comp_head++;
> > -  cc->cbuf_ofs = 0;
> > -  return 0;
> > -}
> > -
> > -static grub_err_t
> > -decomp_getch (struct grub_ntfs_comp *cc, unsigned char *res)
> > -{
> > -  if (cc->cbuf_ofs >= (cc->spc << BLK_SHR))
> > -    {
> > -      if (decomp_nextvcn (cc))
> > -   return grub_errno;
> > -    }
> > -  *res = (unsigned char) cc->cbuf[cc->cbuf_ofs++];
> > -  return 0;
> > -}
> > -
> > -static grub_err_t
> > -decomp_get16 (struct grub_ntfs_comp *cc, grub_uint16_t * res)
> > -{
> > -  unsigned char c1, c2;
> > -
> > -  if ((decomp_getch (cc, &c1)) || (decomp_getch (cc, &c2)))
> > -    return grub_errno;
> > -  *res = ((grub_uint16_t) c2) * 256 + ((grub_uint16_t) c1);
> > -  return 0;
> > -}
> > -
> > -/* Decompress a block (4096 bytes) */
> > -static grub_err_t
> > -decomp_block (struct grub_ntfs_comp *cc, char *dest)
> > -{
> > -  grub_uint16_t flg, cnt;
> > -
> > -  if (decomp_get16 (cc, &flg))
> > -    return grub_errno;
> > -  cnt = (flg & 0xFFF) + 1;
> > -
> > -  if (dest)
> > -    {
> > -      if (flg & 0x8000)
> > -   {
> > -     unsigned char tag;
> > -     unsigned long bits, copied;
> > -
> > -     bits = copied = tag = 0;
> > -     while (cnt > 0)
> > -       {
> > -         if (copied > COM_LEN)
> > -           return grub_error (GRUB_ERR_BAD_FS,
> > -                              "Compression block too large");
> > -
> > -         if (!bits)
> > -           {
> > -             if (decomp_getch (cc, &tag))
> > -               return grub_errno;
> > -
> > -             bits = 8;
> > -             cnt--;
> > -             if (cnt <= 0)
> > -               break;
> > -           }
> > -         if (tag & 1)
> > -           {
> > -             unsigned long i, len, delta, code, lmask, dshift;
> > -             grub_uint16_t word;
> > -
> > -             if (decomp_get16 (cc, &word))
> > -               return grub_errno;
> > -
> > -             code = word;
> > -             cnt -= 2;
> > -
> > -             if (!copied)
> > -               {
> > -                 grub_error (GRUB_ERR_BAD_FS, "Context window empty");
> > -                 return 0;
> > -               }
> > -
> > -             for (i = copied - 1, lmask = 0xFFF, dshift = 12; i >= 0x10;
> > -                  i >>= 1)
> > -               {
> > -                 lmask >>= 1;
> > -                 dshift--;
> > -               }
> > -
> > -             delta = code >> dshift;
> > -             len = (code & lmask) + 3;
> > -
> > -             for (i = 0; i < len; i++)
> > -               {
> > -                 dest[copied] = dest[copied - delta - 1];
> > -                 copied++;
> > -               }
> > -           }
> > -         else
> > -           {
> > -             unsigned char ch;
> > -
> > -             if (decomp_getch (cc, &ch))
> > -               return grub_errno;
> > -             dest[copied++] = ch;
> > -             cnt--;
> > -           }
> > -         tag >>= 1;
> > -         bits--;
> > -       }
> > -     return 0;
> > -   }
> > -      else
> > -   {
> > -     if (cnt != COM_LEN)
> > -       return grub_error (GRUB_ERR_BAD_FS,
> > -                          "Invalid compression block size");
> > -   }
> > -    }
> > -
> > -  while (cnt > 0)
> > -    {
> > -      int n;
> > -
> > -      n = (cc->spc << BLK_SHR) - cc->cbuf_ofs;
> > -      if (n > cnt)
> > -   n = cnt;
> > -      if ((dest) && (n))
> > -   {
> > -     memcpy (dest, &cc->cbuf[cc->cbuf_ofs], n);
> > -     dest += n;
> > -   }
> > -      cnt -= n;
> > -      cc->cbuf_ofs += n;
> > -      if ((cnt) && (decomp_nextvcn (cc)))
> > -   return grub_errno;
> > -    }
> > -  return 0;
> > -}
> > -
> > -static grub_err_t
> > -read_block (struct grub_ntfs_rlst *ctx, char *buf, int num)
> > -{
> > -  int cpb = COM_SEC / ctx->comp.spc;
> > -
> > -  while (num)
> > -    {
> > -      int nn;
> > -
> > -      if ((ctx->target_vcn & 0xF) == 0)
> > -   {
> > -
> > -     if (ctx->comp.comp_head != ctx->comp.comp_tail)
> > -       return grub_error (GRUB_ERR_BAD_FS, "Invalid compression block");
> > -     ctx->comp.comp_head = ctx->comp.comp_tail = 0;
> > -     ctx->comp.cbuf_vcn = ctx->target_vcn;
> > -     ctx->comp.cbuf_ofs = (ctx->comp.spc << BLK_SHR);
> > -     if (ctx->target_vcn >= ctx->next_vcn)
> > -       {
> > -         if (read_run_list (ctx))
> > -           return grub_errno;
> > -       }
> > -     while (ctx->target_vcn + 16 > ctx->next_vcn)
> > -       {
> > -         if (ctx->flags & RF_BLNK)
> > -           break;
> > -         ctx->comp.comp_table[ctx->comp.comp_tail][0] = ctx->next_vcn;
> > -         ctx->comp.comp_table[ctx->comp.comp_tail][1] =
> > -           ctx->curr_lcn + ctx->next_vcn - ctx->curr_vcn;
> > -         ctx->comp.comp_tail++;
> > -         if (read_run_list (ctx))
> > -           return grub_errno;
> > -       }
> > -   }
> > -
> > -      nn = (16 - (ctx->target_vcn & 0xF)) / cpb;
> > -      if (nn > num)
> > -   nn = num;
> > -      num -= nn;
> > -
> > -      if (ctx->flags & RF_BLNK)
> > -   {
> > -     ctx->target_vcn += nn * cpb;
> > -     if (ctx->comp.comp_tail == 0)
> > -       {
> > -         if (buf)
> > -           {
> > -             grub_memset (buf, 0, nn * COM_LEN);
> > -             buf += nn * COM_LEN;
> > -           }
> > -       }
> > -     else
> > -       {
> > -         while (nn)
> > -           {
> > -             if (decomp_block (&ctx->comp, buf))
> > -               return grub_errno;
> > -             if (buf)
> > -               buf += COM_LEN;
> > -             nn--;
> > -           }
> > -       }
> > -   }
> > -      else
> > -   {
> > -     nn *= cpb;
> > -     while ((ctx->comp.comp_head < ctx->comp.comp_tail) && (nn))
> > -       {
> > -         int tt;
> > -
> > -         tt =
> > -           ctx->comp.comp_table[ctx->comp.comp_head][0] -
> > -           ctx->target_vcn;
> > -         if (tt > nn)
> > -           tt = nn;
> > -         ctx->target_vcn += tt;
> > -         if (buf)
> > -           {
> > -             if (grub_disk_read
> > -                 (ctx->comp.disk,
> > -                  (ctx->comp.comp_table[ctx->comp.comp_head][1] -
> > -                   (ctx->comp.comp_table[ctx->comp.comp_head][0] -
> > -                    ctx->target_vcn)) * ctx->comp.spc, 0,
> > -                  tt * (ctx->comp.spc << BLK_SHR), buf))
> > -               return grub_errno;
> > -             buf += tt * (ctx->comp.spc << BLK_SHR);
> > -           }
> > -         nn -= tt;
> > -         if (ctx->target_vcn >=
> > -             ctx->comp.comp_table[ctx->comp.comp_head][0])
> > -           ctx->comp.comp_head++;
> > -       }
> > -     if (nn)
> > -       {
> > -         if (buf)
> > -           {
> > -             if (grub_disk_read
> > -                 (ctx->comp.disk,
> > -                  (ctx->target_vcn - ctx->curr_vcn +
> > -                   ctx->curr_lcn) * ctx->comp.spc, 0,
> > -                  nn * (ctx->comp.spc << BLK_SHR), buf))
> > -               return grub_errno;
> > -             buf += nn * (ctx->comp.spc << BLK_SHR);
> > -           }
> > -         ctx->target_vcn += nn;
> > -       }
> > -   }
> > -    }
> > -  return 0;
> > -}
> > -
> >  static int
> >  grub_ntfs_read_block (grub_fshelp_node_t node, int block)
> >  {
> >    struct grub_ntfs_rlst *ctx;
> > 
> >    ctx = (struct grub_ntfs_rlst *) node;
> > -  if ((unsigned long) block >= ctx->next_vcn)
> > +  if ((grub_uint32_t) block >= ctx->next_vcn)
> >      {
> > -      if (read_run_list (ctx))
> > +      if (grub_ntfs_read_run_list (ctx))
> >     return -1;
> >        return ctx->curr_lcn;
> >      }
> >    else
> > -    return (ctx->flags & RF_BLNK) ? 0 : ((unsigned long) block -
> > +    return (ctx->flags & RF_BLNK) ? 0 : ((grub_uint32_t) block -
> >                                      ctx->curr_vcn + ctx->curr_lcn);
> >  }
> > 
> >  static grub_err_t
> > -read_data (struct grub_ntfs_attr *at, char *pa, char *dest, unsigned long 
> > ofs,
> > -      unsigned long len, int cached,
> > +read_data (struct grub_ntfs_attr *at, char *pa, char *dest, grub_uint32_t 
> > ofs,
> > +      grub_uint32_t len, int cached,
> >        void NESTED_FUNC_ATTR (*read_hook) (grub_disk_addr_t sector,
> >                                            unsigned offset,
> >                                            unsigned length))
> >  {
> > -  unsigned long vcn;
> > +  grub_uint32_t vcn;
> >    struct grub_ntfs_rlst cc, *ctx;
> > -  grub_err_t ret;
> > 
> >    if (len == 0)
> >      return 0;
> > @@ -803,7 +392,7 @@ read_data (struct grub_ntfs_attr *at, ch
> >     {
> >       if ((ofs & (~(COM_LEN - 1))) == at->save_pos)
> >         {
> > -         unsigned long n;
> > +         grub_uint32_t n;
> > 
> >           n = COM_LEN - (ofs - at->save_pos);
> >           if (n > len)
> > @@ -836,13 +425,13 @@ read_data (struct grub_ntfs_attr *at, ch
> >    ctx->curr_lcn = 0;
> >    while (ctx->next_vcn <= ctx->target_vcn)
> >      {
> > -      if (read_run_list (ctx))
> > +      if (grub_ntfs_read_run_list (ctx))
> >     return grub_errno;
> >      }
> > 
> >    if (at->flags & AF_GPOS)
> >      {
> > -      unsigned long st0, st1;
> > +      grub_uint32_t st0, st1;
> > 
> >        st0 =
> >     (ctx->target_vcn - ctx->curr_vcn + ctx->curr_lcn) * ctx->comp.spc +
> > @@ -851,7 +440,7 @@ read_data (struct grub_ntfs_attr *at, ch
> >        if (st1 ==
> >       (ctx->next_vcn - ctx->curr_vcn + ctx->curr_lcn) * ctx->comp.spc)
> >     {
> > -     if (read_run_list (ctx))
> > +     if (grub_ntfs_read_run_list (ctx))
> >         return grub_errno;
> >       st1 = ctx->curr_lcn * ctx->comp.spc;
> >     }
> > @@ -871,81 +460,14 @@ read_data (struct grub_ntfs_attr *at, ch
> >        return grub_errno;
> >      }
> > 
> > -  ctx->comp.comp_head = ctx->comp.comp_tail = 0;
> > -  ctx->comp.cbuf = grub_malloc ((ctx->comp.spc) << BLK_SHR);
> > -  if (!ctx->comp.cbuf)
> > -    return 0;
> > -
> > -  ret = 0;
> > -
> > -  //ctx->comp.disk->read_hook = read_hook;
> > -
> > -  if ((vcn > ctx->target_vcn) &&
> > -      (read_block
> > -       (ctx, NULL, ((vcn - ctx->target_vcn) * ctx->comp.spc) / COM_SEC)))
> > -    {
> > -      ret = grub_errno;
> > -      goto quit;
> > -    }
> > -
> > -  if (ofs % COM_LEN)
> > -    {
> > -      unsigned long t, n, o;
> > -
> > -      t = ctx->target_vcn * (ctx->comp.spc << BLK_SHR);
> > -      if (read_block (ctx, at->sbuf, 1))
> > -   {
> > -     ret = grub_errno;
> > -     goto quit;
> > -   }
> > -
> > -      at->save_pos = t;
> > -
> > -      o = ofs % COM_LEN;
> > -      n = COM_LEN - o;
> > -      if (n > len)
> > -   n = len;
> > -      grub_memcpy (dest, &at->sbuf[o], n);
> > -      if (n == len)
> > -   goto quit;
> > -      dest += n;
> > -      len -= n;
> > -    }
> > -
> > -  if (read_block (ctx, dest, len / COM_LEN))
> > -    {
> > -      ret = grub_errno;
> > -      goto quit;
> > -    }
> > -
> > -  dest += (len / COM_LEN) * COM_LEN;
> > -  len = len % COM_LEN;
> > -  if (len)
> > -    {
> > -      unsigned long t;
> > -
> > -      t = ctx->target_vcn * (ctx->comp.spc << BLK_SHR);
> > -      if (read_block (ctx, at->sbuf, 1))
> > -   {
> > -     ret = grub_errno;
> > -     goto quit;
> > -   }
> > -
> > -      at->save_pos = t;
> > -
> > -      grub_memcpy (dest, at->sbuf, len);
> > -    }
> > -
> > -quit:
> > -  //ctx->comp.disk->read_hook = 0;
> > -  if (ctx->comp.cbuf)
> > -    grub_free (ctx->comp.cbuf);
> > -  return ret;
> > +  return (grub_ntfscomp_func) ? grub_ntfscomp_func (at, dest, ofs, len, 
> > ctx,
> > +                                               vcn) :
> > +    grub_error (GRUB_ERR_BAD_FS, "ntfscomp module not loaded");
> >  }
> > 
> >  static grub_err_t
> > -read_attr (struct grub_ntfs_attr *at, char *dest, unsigned long ofs,
> > -      unsigned long len, int cached,
> > +read_attr (struct grub_ntfs_attr *at, char *dest, grub_uint32_t ofs,
> > +      grub_uint32_t len, int cached,
> >        void NESTED_FUNC_ATTR (*read_hook) (grub_disk_addr_t sector,
> >                                            unsigned offset,
> >                                            unsigned length))
> > @@ -961,7 +483,7 @@ read_attr (struct grub_ntfs_attr *at, ch
> >    if (at->flags & AF_ALST)
> >      {
> >        char *pa;
> > -      unsigned long vcn;
> > +      grub_uint32_t vcn;
> > 
> >        vcn = ofs / (at->mft->data->spc << BLK_SHR);
> >        pa = at->attr_nxt + u16at (at->attr_nxt, 4);
> > @@ -987,7 +509,7 @@ read_attr (struct grub_ntfs_attr *at, ch
> >  }
> > 
> >  static grub_err_t
> > -read_mft (struct grub_ntfs_data *data, char *buf, unsigned long mftno)
> > +read_mft (struct grub_ntfs_data *data, char *buf, grub_uint32_t mftno)
> >  {
> >    if (read_attr
> >        (&data->mmft.attr, buf, mftno * (data->mft_size << BLK_SHR),
> > @@ -1220,14 +742,14 @@ grub_ntfs_iterate_dir (grub_fshelp_node_
> > 
> >    if (bitmap)
> >      {
> > -      unsigned long v, i;
> > +      grub_uint32_t v, i;
> > 
> >        indx = grub_malloc (mft->data->idx_size << BLK_SHR);
> >        if (indx == NULL)
> >     goto done;
> > 
> >        v = 1;
> > -      for (i = 0; i < (unsigned long) bitmap_len * 8; i++)
> > +      for (i = 0; i < (grub_uint32_t) bitmap_len * 8; i++)
> >     {
> >       if (*bitmap & v)
> >         {
> > Index: fs/ntfscomp.c
> > ===================================================================
> > RCS file: /sources/grub/grub2/fs/ntfscomp.c,v
> > diff -Nu fs/ntfscomp.c
> > --- /dev/null       2007-11-30 08:59:18.260044737 +0800
> > +++ fs/ntfscomp.c   2007-11-30 02:02:44.328125000 +0800
> > @@ -0,0 +1,375 @@
> > +/* ntfscomp.c - compression support for the NTFS filesystem */
> > +/*
> > + *  Copyright (C) 2007 Free Software Foundation, Inc.
> > + *
> > + *  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 3 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, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#include <grub/file.h>
> > +#include <grub/mm.h>
> > +#include <grub/misc.h>
> > +#include <grub/disk.h>
> > +#include <grub/dl.h>
> > +#include <grub/fshelp.h>
> > +#include <grub/ntfs.h>
> > +
> > +static grub_err_t
> > +decomp_nextvcn (struct grub_ntfs_comp *cc)
> > +{
> > +  if (cc->comp_head >= cc->comp_tail)
> > +    return grub_error (GRUB_ERR_BAD_FS, "Compression block overflown");
> > +  if (grub_disk_read
> > +      (cc->disk,
> > +       (cc->comp_table[cc->comp_head][1] -
> > +   (cc->comp_table[cc->comp_head][0] - cc->cbuf_vcn)) * cc->spc, 0,
> > +       cc->spc << BLK_SHR, cc->cbuf))
> > +    return grub_errno;
> > +  cc->cbuf_vcn++;
> > +  if ((cc->cbuf_vcn >= cc->comp_table[cc->comp_head][0]))
> > +    cc->comp_head++;
> > +  cc->cbuf_ofs = 0;
> > +  return 0;
> > +}
> > +
> > +static grub_err_t
> > +decomp_getch (struct grub_ntfs_comp *cc, unsigned char *res)
> > +{
> > +  if (cc->cbuf_ofs >= (cc->spc << BLK_SHR))
> > +    {
> > +      if (decomp_nextvcn (cc))
> > +   return grub_errno;
> > +    }
> > +  *res = (unsigned char) cc->cbuf[cc->cbuf_ofs++];
> > +  return 0;
> > +}
> > +
> > +static grub_err_t
> > +decomp_get16 (struct grub_ntfs_comp *cc, grub_uint16_t * res)
> > +{
> > +  unsigned char c1, c2;
> > +
> > +  if ((decomp_getch (cc, &c1)) || (decomp_getch (cc, &c2)))
> > +    return grub_errno;
> > +  *res = ((grub_uint16_t) c2) * 256 + ((grub_uint16_t) c1);
> > +  return 0;
> > +}
> > +
> > +/* Decompress a block (4096 bytes) */
> > +static grub_err_t
> > +decomp_block (struct grub_ntfs_comp *cc, char *dest)
> > +{
> > +  grub_uint16_t flg, cnt;
> > +
> > +  if (decomp_get16 (cc, &flg))
> > +    return grub_errno;
> > +  cnt = (flg & 0xFFF) + 1;
> > +
> > +  if (dest)
> > +    {
> > +      if (flg & 0x8000)
> > +   {
> > +     unsigned char tag;
> > +     grub_uint32_t bits, copied;
> > +
> > +     bits = copied = tag = 0;
> > +     while (cnt > 0)
> > +       {
> > +         if (copied > COM_LEN)
> > +           return grub_error (GRUB_ERR_BAD_FS,
> > +                              "Compression block too large");
> > +
> > +         if (!bits)
> > +           {
> > +             if (decomp_getch (cc, &tag))
> > +               return grub_errno;
> > +
> > +             bits = 8;
> > +             cnt--;
> > +             if (cnt <= 0)
> > +               break;
> > +           }
> > +         if (tag & 1)
> > +           {
> > +             grub_uint32_t i, len, delta, code, lmask, dshift;
> > +             grub_uint16_t word;
> > +
> > +             if (decomp_get16 (cc, &word))
> > +               return grub_errno;
> > +
> > +             code = word;
> > +             cnt -= 2;
> > +
> > +             if (!copied)
> > +               {
> > +                 grub_error (GRUB_ERR_BAD_FS, "Context window empty");
> > +                 return 0;
> > +               }
> > +
> > +             for (i = copied - 1, lmask = 0xFFF, dshift = 12; i >= 0x10;
> > +                  i >>= 1)
> > +               {
> > +                 lmask >>= 1;
> > +                 dshift--;
> > +               }
> > +
> > +             delta = code >> dshift;
> > +             len = (code & lmask) + 3;
> > +
> > +             for (i = 0; i < len; i++)
> > +               {
> > +                 dest[copied] = dest[copied - delta - 1];
> > +                 copied++;
> > +               }
> > +           }
> > +         else
> > +           {
> > +             unsigned char ch;
> > +
> > +             if (decomp_getch (cc, &ch))
> > +               return grub_errno;
> > +             dest[copied++] = ch;
> > +             cnt--;
> > +           }
> > +         tag >>= 1;
> > +         bits--;
> > +       }
> > +     return 0;
> > +   }
> > +      else
> > +   {
> > +     if (cnt != COM_LEN)
> > +       return grub_error (GRUB_ERR_BAD_FS,
> > +                          "Invalid compression block size");
> > +   }
> > +    }
> > +
> > +  while (cnt > 0)
> > +    {
> > +      int n;
> > +
> > +      n = (cc->spc << BLK_SHR) - cc->cbuf_ofs;
> > +      if (n > cnt)
> > +   n = cnt;
> > +      if ((dest) && (n))
> > +   {
> > +     memcpy (dest, &cc->cbuf[cc->cbuf_ofs], n);
> > +     dest += n;
> > +   }
> > +      cnt -= n;
> > +      cc->cbuf_ofs += n;
> > +      if ((cnt) && (decomp_nextvcn (cc)))
> > +   return grub_errno;
> > +    }
> > +  return 0;
> > +}
> > +
> > +static grub_err_t
> > +read_block (struct grub_ntfs_rlst *ctx, char *buf, int num)
> > +{
> > +  int cpb = COM_SEC / ctx->comp.spc;
> > +
> > +  while (num)
> > +    {
> > +      int nn;
> > +
> > +      if ((ctx->target_vcn & 0xF) == 0)
> > +   {
> > +
> > +     if (ctx->comp.comp_head != ctx->comp.comp_tail)
> > +       return grub_error (GRUB_ERR_BAD_FS, "Invalid compression block");
> > +     ctx->comp.comp_head = ctx->comp.comp_tail = 0;
> > +     ctx->comp.cbuf_vcn = ctx->target_vcn;
> > +     ctx->comp.cbuf_ofs = (ctx->comp.spc << BLK_SHR);
> > +     if (ctx->target_vcn >= ctx->next_vcn)
> > +       {
> > +         if (grub_ntfs_read_run_list (ctx))
> > +           return grub_errno;
> > +       }
> > +     while (ctx->target_vcn + 16 > ctx->next_vcn)
> > +       {
> > +         if (ctx->flags & RF_BLNK)
> > +           break;
> > +         ctx->comp.comp_table[ctx->comp.comp_tail][0] = ctx->next_vcn;
> > +         ctx->comp.comp_table[ctx->comp.comp_tail][1] =
> > +           ctx->curr_lcn + ctx->next_vcn - ctx->curr_vcn;
> > +         ctx->comp.comp_tail++;
> > +         if (grub_ntfs_read_run_list (ctx))
> > +           return grub_errno;
> > +       }
> > +   }
> > +
> > +      nn = (16 - (ctx->target_vcn & 0xF)) / cpb;
> > +      if (nn > num)
> > +   nn = num;
> > +      num -= nn;
> > +
> > +      if (ctx->flags & RF_BLNK)
> > +   {
> > +     ctx->target_vcn += nn * cpb;
> > +     if (ctx->comp.comp_tail == 0)
> > +       {
> > +         if (buf)
> > +           {
> > +             grub_memset (buf, 0, nn * COM_LEN);
> > +             buf += nn * COM_LEN;
> > +           }
> > +       }
> > +     else
> > +       {
> > +         while (nn)
> > +           {
> > +             if (decomp_block (&ctx->comp, buf))
> > +               return grub_errno;
> > +             if (buf)
> > +               buf += COM_LEN;
> > +             nn--;
> > +           }
> > +       }
> > +   }
> > +      else
> > +   {
> > +     nn *= cpb;
> > +     while ((ctx->comp.comp_head < ctx->comp.comp_tail) && (nn))
> > +       {
> > +         int tt;
> > +
> > +         tt =
> > +           ctx->comp.comp_table[ctx->comp.comp_head][0] -
> > +           ctx->target_vcn;
> > +         if (tt > nn)
> > +           tt = nn;
> > +         ctx->target_vcn += tt;
> > +         if (buf)
> > +           {
> > +             if (grub_disk_read
> > +                 (ctx->comp.disk,
> > +                  (ctx->comp.comp_table[ctx->comp.comp_head][1] -
> > +                   (ctx->comp.comp_table[ctx->comp.comp_head][0] -
> > +                    ctx->target_vcn)) * ctx->comp.spc, 0,
> > +                  tt * (ctx->comp.spc << BLK_SHR), buf))
> > +               return grub_errno;
> > +             buf += tt * (ctx->comp.spc << BLK_SHR);
> > +           }
> > +         nn -= tt;
> > +         if (ctx->target_vcn >=
> > +             ctx->comp.comp_table[ctx->comp.comp_head][0])
> > +           ctx->comp.comp_head++;
> > +       }
> > +     if (nn)
> > +       {
> > +         if (buf)
> > +           {
> > +             if (grub_disk_read
> > +                 (ctx->comp.disk,
> > +                  (ctx->target_vcn - ctx->curr_vcn +
> > +                   ctx->curr_lcn) * ctx->comp.spc, 0,
> > +                  nn * (ctx->comp.spc << BLK_SHR), buf))
> > +               return grub_errno;
> > +             buf += nn * (ctx->comp.spc << BLK_SHR);
> > +           }
> > +         ctx->target_vcn += nn;
> > +       }
> > +   }
> > +    }
> > +  return 0;
> > +}
> > +
> > +static grub_err_t
> > +ntfscomp (struct grub_ntfs_attr *at, char *dest, grub_uint32_t ofs,
> > +     grub_uint32_t len, struct grub_ntfs_rlst *ctx, grub_uint32_t vcn)
> > +{
> > +  grub_err_t ret;
> > +
> > +  ctx->comp.comp_head = ctx->comp.comp_tail = 0;
> > +  ctx->comp.cbuf = grub_malloc ((ctx->comp.spc) << BLK_SHR);
> > +  if (!ctx->comp.cbuf)
> > +    return 0;
> > +
> > +  ret = 0;
> > +
> > +  //ctx->comp.disk->read_hook = read_hook;
> > +
> > +  if ((vcn > ctx->target_vcn) &&
> > +      (read_block
> > +       (ctx, NULL, ((vcn - ctx->target_vcn) * ctx->comp.spc) / COM_SEC)))
> > +    {
> > +      ret = grub_errno;
> > +      goto quit;
> > +    }
> > +
> > +  if (ofs % COM_LEN)
> > +    {
> > +      grub_uint32_t t, n, o;
> > +
> > +      t = ctx->target_vcn * (ctx->comp.spc << BLK_SHR);
> > +      if (read_block (ctx, at->sbuf, 1))
> > +   {
> > +     ret = grub_errno;
> > +     goto quit;
> > +   }
> > +
> > +      at->save_pos = t;
> > +
> > +      o = ofs % COM_LEN;
> > +      n = COM_LEN - o;
> > +      if (n > len)
> > +   n = len;
> > +      grub_memcpy (dest, &at->sbuf[o], n);
> > +      if (n == len)
> > +   goto quit;
> > +      dest += n;
> > +      len -= n;
> > +    }
> > +
> > +  if (read_block (ctx, dest, len / COM_LEN))
> > +    {
> > +      ret = grub_errno;
> > +      goto quit;
> > +    }
> > +
> > +  dest += (len / COM_LEN) * COM_LEN;
> > +  len = len % COM_LEN;
> > +  if (len)
> > +    {
> > +      grub_uint32_t t;
> > +
> > +      t = ctx->target_vcn * (ctx->comp.spc << BLK_SHR);
> > +      if (read_block (ctx, at->sbuf, 1))
> > +   {
> > +     ret = grub_errno;
> > +     goto quit;
> > +   }
> > +
> > +      at->save_pos = t;
> > +
> > +      grub_memcpy (dest, at->sbuf, len);
> > +    }
> > +
> > +quit:
> > +  //ctx->comp.disk->read_hook = 0;
> > +  if (ctx->comp.cbuf)
> > +    grub_free (ctx->comp.cbuf);
> > +  return ret;
> > +}
> > +
> > +GRUB_MOD_INIT (ntfscomp)
> > +{
> > +  (void) mod;
> > +  grub_ntfscomp_func = ntfscomp;
> > +}
> > +
> > +GRUB_MOD_FINI (ntfscomp)
> > +{
> > +  grub_ntfscomp_func = NULL;
> > +}
> > Index: include/grub/ntfs.h
> > ===================================================================
> > RCS file: /sources/grub/grub2/include/grub/ntfs.h,v
> > diff -Nu include/grub/ntfs.h
> > --- /dev/null       2007-11-30 08:59:18.260044737 +0800
> > +++ include/grub/ntfs.h     2007-11-30 01:59:16.031250000 +0800
> > @@ -0,0 +1,184 @@
> > +/* ntfs.h - header for the NTFS filesystem */
> > +/*
> > + *  GRUB  --  GRand Unified Bootloader
> > + *  Copyright (C) 2007  Free Software Foundation, Inc.
> > + *
> > + *  GRUB 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 3 of the License, or
> > + *  (at your option) any later version.
> > + *
> > + *  GRUB 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 GRUB.  If not, see <http://www.gnu.org/licenses/>.
> > + */
> > +
> > +#ifndef GRUB_NTFS_H
> > +#define GRUB_NTFS_H        1
> > +
> > +#define FILE_MFT      0
> > +#define FILE_MFTMIRR  1
> > +#define FILE_LOGFILE  2
> > +#define FILE_VOLUME   3
> > +#define FILE_ATTRDEF  4
> > +#define FILE_ROOT     5
> > +#define FILE_BITMAP   6
> > +#define FILE_BOOT     7
> > +#define FILE_BADCLUS  8
> > +#define FILE_QUOTA    9
> > +#define FILE_UPCASE  10
> > +
> > +#define AT_STANDARD_INFORMATION    0x10
> > +#define AT_ATTRIBUTE_LIST  0x20
> > +#define AT_FILENAME                0x30
> > +#define AT_OBJECT_ID               0x40
> > +#define AT_SECURITY_DESCRIPTOR     0x50
> > +#define AT_VOLUME_NAME             0x60
> > +#define AT_VOLUME_INFORMATION      0x70
> > +#define AT_DATA                    0x80
> > +#define AT_INDEX_ROOT              0x90
> > +#define AT_INDEX_ALLOCATION        0xA0
> > +#define AT_BITMAP          0xB0
> > +#define AT_SYMLINK         0xC0
> > +#define AT_EA_INFORMATION  0xD0
> > +#define AT_EA                      0xE0
> > +
> > +#define ATTR_READ_ONLY             0x1
> > +#define ATTR_HIDDEN                0x2
> > +#define ATTR_SYSTEM                0x4
> > +#define ATTR_ARCHIVE               0x20
> > +#define ATTR_DEVICE                0x40
> > +#define ATTR_NORMAL                0x80
> > +#define ATTR_TEMPORARY             0x100
> > +#define ATTR_SPARSE                0x200
> > +#define ATTR_REPARSE               0x400
> > +#define ATTR_COMPRESSED            0x800
> > +#define ATTR_OFFLINE               0x1000
> > +#define ATTR_NOT_INDEXED   0x2000
> > +#define ATTR_ENCRYPTED             0x4000
> > +#define ATTR_DIRECTORY             0x10000000
> > +#define ATTR_INDEX_VIEW            0x20000000
> > +
> > +#define FLAG_COMPRESSED            1
> > +#define FLAG_ENCRYPTED             0x4000
> > +#define FLAG_SPARSE                0x8000
> > +
> > +#define BLK_SHR            GRUB_DISK_SECTOR_BITS
> > +
> > +#define MAX_MFT            (1024 >> BLK_SHR)
> > +#define MAX_IDX            (16384 >> BLK_SHR)
> > +#define MAX_SPC            (4096 >> BLK_SHR)
> > +
> > +#define COM_LEN            4096
> > +#define COM_SEC            (COM_LEN >> BLK_SHR)
> > +
> > +#define BMP_LEN            4096
> > +
> > +#define AF_ALST            1
> > +#define AF_MMFT            2
> > +#define AF_GPOS            4
> > +
> > +#define RF_COMP            1
> > +#define RF_CBLK            2
> > +#define RF_BLNK            4
> > +
> > +#define valueat(buf,ofs,type)      *((type*)(((char*)buf)+ofs))
> > +
> > +#define u16at(buf,ofs)     grub_le_to_cpu16(valueat(buf,ofs,grub_uint16_t))
> > +#define u32at(buf,ofs)     grub_le_to_cpu32(valueat(buf,ofs,grub_uint32_t))
> > +#define u64at(buf,ofs)     grub_le_to_cpu64(valueat(buf,ofs,grub_uint64_t))
> > +
> > +#define v16at(buf,ofs)     valueat(buf,ofs,grub_uint16_t)
> > +#define v32at(buf,ofs)     valueat(buf,ofs,grub_uint32_t)
> > +#define v64at(buf,ofs)     valueat(buf,ofs,grub_uint64_t)
> > +
> > +struct grub_ntfs_bpb
> > +{
> > +  grub_uint8_t jmp_boot[3];
> > +  grub_uint8_t oem_name[8];
> > +  grub_uint16_t bytes_per_sector;
> > +  grub_uint8_t sectors_per_cluster;
> > +  grub_uint8_t reserved_1[7];
> > +  grub_uint8_t media;
> > +  grub_uint16_t reserved_2;
> > +  grub_uint16_t sectors_per_track;
> > +  grub_uint16_t num_heads;
> > +  grub_uint32_t num_hidden_sectors;
> > +  grub_uint32_t reserved_3[2];
> > +  grub_uint64_t num_total_sectors;
> > +  grub_uint64_t mft_lcn;
> > +  grub_uint64_t mft_mirr_lcn;
> > +  grub_int8_t clusters_per_mft;
> > +  grub_int8_t reserved_4[3];
> > +  grub_int8_t clusters_per_index;
> > +  grub_int8_t reserved_5[3];
> > +  grub_uint64_t serial_number;
> > +  grub_uint32_t checksum;
> > +} __attribute__ ((packed));
> > +
> > +#define grub_ntfs_file grub_fshelp_node
> > +
> > +struct grub_ntfs_attr
> > +{
> > +  int flags;
> > +  char *emft_buf, *edat_buf;
> > +  char *attr_cur, *attr_nxt, *attr_end;
> > +  grub_uint32_t save_pos;
> > +  char *sbuf;
> > +  struct grub_ntfs_file *mft;
> > +};
> > +
> > +struct grub_fshelp_node
> > +{
> > +  struct grub_ntfs_data *data;
> > +  char *buf;
> > +  grub_uint32_t size;
> > +  grub_uint32_t ino;
> > +  int inode_read;
> > +  struct grub_ntfs_attr attr;
> > +};
> > +
> > +struct grub_ntfs_data
> > +{
> > +  struct grub_ntfs_file cmft;
> > +  struct grub_ntfs_file mmft;
> > +  grub_disk_t disk;
> > +  grub_uint32_t mft_size;
> > +  grub_uint32_t idx_size;
> > +  grub_uint32_t spc;
> > +  grub_uint32_t blocksize;
> > +  grub_uint32_t mft_start;
> > +};
> > +
> > +struct grub_ntfs_comp
> > +{
> > +  grub_disk_t disk;
> > +  int comp_head, comp_tail;
> > +  grub_uint32_t comp_table[16][2];
> > +  grub_uint32_t cbuf_ofs, cbuf_vcn, spc;
> > +  char *cbuf;
> > +};
> > +
> > +struct grub_ntfs_rlst
> > +{
> > +  int flags;
> > +  grub_uint32_t target_vcn, curr_vcn, next_vcn, curr_lcn;
> > +  char *cur_run;
> > +  struct grub_ntfs_attr *attr;
> > +  struct grub_ntfs_comp comp;
> > +};
> > +
> > +typedef grub_err_t (*ntfscomp_func_t) (struct grub_ntfs_attr * at, char 
> > *dest,
> > +                                  grub_uint32_t ofs, grub_uint32_t len,
> > +                                  struct grub_ntfs_rlst * ctx,
> > +                                  grub_uint32_t vcn);
> > +
> > +extern ntfscomp_func_t EXPORT_VAR (grub_ntfscomp_func);
> > +
> > +grub_err_t EXPORT_FUNC(grub_ntfs_read_run_list) (struct grub_ntfs_rlst 
> > *ctx);
> > +
> > +#endif /* ! GRUB_NTFS_H */
> > 
> > 
> > _______________________________________________
> > Grub-devel mailing list
> > address@hidden
> > http://lists.gnu.org/mailman/listinfo/grub-devel
> > 
> 
> -- 
> Robert Millan
> 
> <GPLv2> I know my rights; I want my phone call!
> <DRM> What use is a phone call, if you are unable to speak?
> (as seen on /.)
> 
> 
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/grub-devel
> 

-- 
Robert Millan

<GPLv2> I know my rights; I want my phone call!
<DRM> What use is a phone call, if you are unable to speak?
(as seen on /.)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]