Author: gedmurphy
Date: Sat Apr  2 15:22:48 2011
New Revision: 51227

URL: http://svn.reactos.org/svn/reactos?rev=51227&view=rev
Log:
{FULLFAT]
- Update FullFat to the latest stable release (1.0.5)
- I'm awaiting a reply from James as to when 1.1.0 will be released as it have 
some nice improvements.

Added:
    trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h   (with props)
Modified:
    trunk/reactos/include/reactos/libs/fullfat/ff_config.h
    trunk/reactos/include/reactos/libs/fullfat/ff_dir.h
    trunk/reactos/include/reactos/libs/fullfat/ff_fat.h
    trunk/reactos/include/reactos/libs/fullfat/ff_ioman.h
    trunk/reactos/include/reactos/libs/fullfat/ff_memory.h
    trunk/reactos/include/reactos/libs/fullfat/fullfat.h
    trunk/reactos/lib/3rdparty/fullfat/ff_dir.c
    trunk/reactos/lib/3rdparty/fullfat/ff_dir.h
    trunk/reactos/lib/3rdparty/fullfat/ff_fat.c
    trunk/reactos/lib/3rdparty/fullfat/ff_file.c
    trunk/reactos/lib/3rdparty/fullfat/ff_hash.c
    trunk/reactos/lib/3rdparty/fullfat/ff_ioman.c
    trunk/reactos/lib/3rdparty/fullfat/ff_memory.c

Modified: trunk/reactos/include/reactos/libs/fullfat/ff_config.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_config.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_config.h [iso-8859-1] 
(original)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_config.h [iso-8859-1] Sat Apr 
 2 15:22:48 2011
@@ -74,13 +74,24 @@
                                                                // within the 
same path. E.g. a copy \dir1\*.* \dir2\*.* command.
                                                                // This command 
requires FF_MAX_PATH number of bytes of memory. (Defined below, default 2600).
 
+//---------- BLKDEV USES SEMAPHORE
+#define FF_BLKDEV_USES_SEM             // When defined, each call to 
fnReadBlocks and fnWriteBlocks will be done while semaphore is locked
+                                                               // See also 
ff_safety.c
+                                                               // (HT addition)
+
 
 #define FF_PATH_CACHE_DEPTH    2       // The Number of PATH's to Cache.
 
 //---------- DON'T USE MALLOC
 //#define FF_NO_MALLOC
 
-//---------- DON'T 
+#define        FF_MALLOC(aSize)                malloc(aSize)
+#define        FF_FREE(apPtr)                  free(apPtr)
+
+//#define FF_INLINE_MEMORY_ACCESS
+
+//#define FF_INLINE static __forceinline       // Keywords to inline functions 
(Windows)
+#define FF_INLINE static inline                                // Standard for 
GCC
 
 
 //---------- Hash Table Support
@@ -117,7 +128,7 @@
 //---------- AUTOMATIC SETTINGS DO NOT EDIT -- These configure your options 
from above, and check sanity!
 
 #ifdef FF_LFN_SUPPORT
-#define FF_MAX_FILENAME                260
+#define FF_MAX_FILENAME                (129)
 #else
 #define        FF_MAX_FILENAME         13
 #endif

Modified: trunk/reactos/include/reactos/libs/fullfat/ff_dir.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_dir.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_dir.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_dir.h [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -43,7 +43,7 @@
 #include "ff_ioman.h"
 #include "ff_blk.h"
 #include "ff_fat.h"
-#include "fat.h"
+#include "ff_fatdef.h"
 #include "ff_memory.h"
 #include "ff_time.h"
 #include "ff_hash.h"

Modified: trunk/reactos/include/reactos/libs/fullfat/ff_fat.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_fat.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_fat.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_fat.h [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -39,7 +39,7 @@
 #define _FF_FAT_H_
 
 #include "ff_config.h"
-#include "fat.h"
+#include "ff_fatdef.h"
 #include "ff_ioman.h"
 #include "ff_blk.h"
 #include "ff_types.h"

Added: trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h?rev=51227&view=auto
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h (added)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h [iso-8859-1] Sat Apr 
 2 15:22:48 2011
@@ -1,0 +1,90 @@
+/*****************************************************************************
+ *  FullFAT - High Performance, Thread-Safe Embedded FAT File-System         *
+ *  Copyright (C) 2009  James Walmsley ([email protected])                    *
+ *                                                                           *
+ *  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/>.    *
+ *                                                                           *
+ *  IMPORTANT NOTICE:                                                        *
+ *  =================                                                        *
+ *  Alternative Licensing is available directly from the Copyright holder,   *
+ *  (James Walmsley). For more information consult LICENSING.TXT to obtain   *
+ *  a Commercial license.                                                    *
+ *                                                                           *
+ *  See RESTRICTIONS.TXT for extra restrictions on the use of FullFAT.       *
+ *                                                                           *
+ *  Removing the above notice is illegal and will invalidate this license.   *
+ *****************************************************************************
+ *  See http://worm.me.uk/fullfat for more information.                      *
+ *  Or  http://fullfat.googlecode.com/ for latest releases and the wiki.     *
+ *****************************************************************************/
+#ifndef _FF_FATDEF_H_
+#define _FF_FATDEF_H_
+
+/*
+       This file defines offsets to various data for the FAT specification.
+*/
+
+// MBR / PBR Offsets
+
+#define FF_FAT_BYTES_PER_SECTOR                0x00B
+#define FF_FAT_SECTORS_PER_CLUS                0x00D
+#define FF_FAT_RESERVED_SECTORS                0x00E
+#define FF_FAT_NUMBER_OF_FATS          0x010
+#define FF_FAT_ROOT_ENTRY_COUNT                0x011
+#define FF_FAT_16_TOTAL_SECTORS                0x013
+#define FF_FAT_32_TOTAL_SECTORS                0x020
+#define FF_FAT_16_SECTORS_PER_FAT      0x016
+#define FF_FAT_32_SECTORS_PER_FAT      0x024
+#define FF_FAT_ROOT_DIR_CLUSTER                0x02C
+
+#define FF_FAT_16_VOL_LABEL                    0x02B
+#define FF_FAT_32_VOL_LABEL                    0x047
+
+#define FF_FAT_PTBL                                    0x1BE
+#define FF_FAT_PTBL_LBA                                0x008
+#define FF_FAT_PTBL_ACTIVE          0x000
+#define FF_FAT_PTBL_ID              0x004
+
+#define FF_FAT_MBR_SIGNATURE        0x1FE
+
+#define FF_FAT_DELETED                         0xE5
+
+// Directory Entry Offsets
+#define FF_FAT_DIRENT_SHORTNAME                0x000
+#define FF_FAT_DIRENT_ATTRIB           0x00B
+#define FF_FAT_DIRENT_CREATE_TIME      0x00E   ///< Creation Time.
+#define FF_FAT_DIRENT_CREATE_DATE      0x010   ///< Creation Date.
+#define FF_FAT_DIRENT_LASTACC_DATE     0x012   ///< Date of Last Access.
+#define FF_FAT_DIRENT_CLUS_HIGH                0x014
+#define FF_FAT_DIRENT_LASTMOD_TIME     0x016   ///< Time of Last modification.
+#define FF_FAT_DIRENT_LASTMOD_DATE     0x018   ///< Date of Last modification.
+#define FF_FAT_DIRENT_CLUS_LOW         0x01A
+#define FF_FAT_DIRENT_FILESIZE         0x01C
+#define FF_FAT_LFN_ORD                         0x000
+#define FF_FAT_LFN_NAME_1                      0x001
+#define        FF_FAT_LFN_CHECKSUM                     0x00D
+#define FF_FAT_LFN_NAME_2                      0x00E
+#define FF_FAT_LFN_NAME_3                      0x01C
+
+// Dirent Attributes
+#define FF_FAT_ATTR_READONLY           0x01
+#define FF_FAT_ATTR_HIDDEN                     0x02
+#define FF_FAT_ATTR_SYSTEM                     0x04
+#define FF_FAT_ATTR_VOLID                      0x08
+#define FF_FAT_ATTR_DIR                                0x10
+#define FF_FAT_ATTR_ARCHIVE                    0x20
+#define FF_FAT_ATTR_LFN                                0x0F
+
+#endif
+

Propchange: trunk/reactos/include/reactos/libs/fullfat/ff_fatdef.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: trunk/reactos/include/reactos/libs/fullfat/ff_ioman.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_ioman.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_ioman.h [iso-8859-1] 
(original)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_ioman.h [iso-8859-1] Sat Apr  
2 15:22:48 2011
@@ -100,10 +100,10 @@
  **/
 typedef struct {
        FF_T_UINT32             Sector;                 ///< The LBA of the 
Cached sector.
-       FF_T_UINT8              Mode;                   ///< Read or Write mode.
+       FF_T_UINT32             LRU;                    ///< For the Least 
Recently Used algorithm.
        FF_T_UINT16             NumHandles;             ///< Number of objects 
using this buffer.
        FF_T_UINT16             Persistance;    ///< For the persistance 
algorithm.
-       FF_T_UINT32             LRU;                    ///< For the Least 
Recently Used algorithm.
+       FF_T_UINT8              Mode;                   ///< Read or Write mode.
        FF_T_BOOL               Modified;               ///< If the sector was 
modified since read.
        FF_T_BOOL               Valid;                  ///< Initially FALSE.
        FF_T_UINT8              *pBuffer;               ///< Pointer to the 
cache block.
@@ -129,7 +129,7 @@
        FF_T_UINT16             BlkSize;                        ///< Size of a 
Sector Block in bytes.
        FF_T_UINT8      BlkFactor;                      ///< Scale Factor for 
blocksizes above 512!
        //FF_T_INT8             Name[FF_MAX_PARTITION_NAME];    ///< Partition 
Identifier e.g. c: sd0: etc.
-       //FF_T_INT8             VolLabel[12];           ///< Volume Label of 
the partition.
+       FF_T_INT8               VolLabel[12];           ///< Volume Label of 
the partition.
        FF_T_UINT32             BeginLBA;                       ///< LBA start 
address of the partition.
        FF_T_UINT32             PartSize;                       ///< Size of 
Partition in number of sectors.
        FF_T_UINT32             FatBeginLBA;            ///< LBA of the FAT 
tables.
@@ -182,14 +182,15 @@
        FF_BLK_DEVICE   *pBlkDevice;            ///< Pointer to a Block device 
description.
        FF_PARTITION    *pPartition;            ///< Pointer to a partition 
description.
        FF_BUFFER               *pBuffers;                      ///< Pointer to 
the first buffer description.
+       void                    *pSemaphore;            ///< Pointer to a 
Semaphore object. (For buffer description modifications only!).
+       void                    *FirstFile;                     ///< Pointer to 
the first File object.
+       FF_T_UINT8              *pCacheMem;                     ///< Pointer to 
a block of memory for the cache.
        FF_T_UINT32             LastReplaced;           ///< Marks which sector 
was last replaced in the cache.
        FF_T_UINT16             BlkSize;                        ///< The Block 
size that IOMAN is configured to.
-       FF_T_UINT8              *pCacheMem;                     ///< Pointer to 
a block of memory for the cache.
        FF_T_UINT16             CacheSize;                      ///< Size of 
the cache in number of Sectors.
+       FF_T_UINT8              PreventFlush;           ///< Flushing to disk 
only allowed when 0
        FF_T_UINT8              MemAllocation;          ///< Bit-Mask 
identifying allocated pointers.
        FF_T_UINT8              Locks;                          ///< Lock Flag 
for FAT & DIR Locking etc (This must be accessed via a semaphore).
-       void                    *pSemaphore;            ///< Pointer to a 
Semaphore object. (For buffer description modifications only!).
-       void                    *FirstFile;                     ///< Pointer to 
the first File object.
 } FF_IOMAN;
 
 // Bit-Masks for Memory Allocation testing.

Modified: trunk/reactos/include/reactos/libs/fullfat/ff_memory.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/ff_memory.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/ff_memory.h [iso-8859-1] 
(original)
+++ trunk/reactos/include/reactos/libs/fullfat/ff_memory.h [iso-8859-1] Sat Apr 
 2 15:22:48 2011
@@ -41,19 +41,119 @@
 #include "ff_config.h"
 #include "ff_types.h"
 
-
+/*
+       HT changed type of aOffset to u32
+*/
 //---------- PROTOTYPES
 
-FF_T_UINT8             FF_getChar      (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset);
-FF_T_UINT16            FF_getShort     (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset);
-FF_T_UINT32            FF_getLong      (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset);
+#if    defined(FF_LITTLE_ENDIAN)
 
-void                   FF_putChar      (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset, FF_T_UINT8 Value);
-void                   FF_putShort     (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset, FF_T_UINT16 Value);
-void                   FF_putLong      (FF_T_UINT8 *pBuffer, FF_T_UINT16 
offset, FF_T_UINT32 Value);
+typedef struct {
+       FF_T_UINT8      u8_0;
+       FF_T_UINT8      u8_1;
+} FF_T_SHORT;
 
-void                   *FF_Malloc(FF_T_UINT32 allocSize);
-void                   FF_Free(void *pBuffer);
+typedef struct {
+       FF_T_UINT8      u8_0;
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_2;
+       FF_T_UINT8      u8_3;
+} FF_T_LONG;
+
+#elif defined(FF_BIG_ENDIAN)
+
+typedef struct {
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_0;
+} FF_T_SHORT;
+
+typedef struct {
+       FF_T_UINT8      u8_3;
+       FF_T_UINT8      u8_2;
+       FF_T_UINT8      u8_1;
+       FF_T_UINT8      u8_0;
+} FF_T_LONG;
+
+#else
+
+#error Little or Big Endian?
 
 #endif
 
+//! 16-bit union.
+typedef union {
+   FF_T_UINT16 u16;
+   FF_T_SHORT  bytes;
+} FF_T_UN16;
+
+//! 32-bit union.
+typedef union {
+  FF_T_UINT32  u32;
+  FF_T_LONG            bytes;
+} FF_T_UN32;
+
+/*     HT inlined these functions:
+ */
+
+#ifdef FF_INLINE_MEMORY_ACCESS
+
+FF_INLINE FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset)
+{
+       return (FF_T_UINT8) (pBuffer[aOffset]);
+}
+
+FF_INLINE FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset)
+{
+       FF_T_UN16 u16;
+       pBuffer += aOffset;
+       u16.bytes.u8_1 = pBuffer[1];
+       u16.bytes.u8_0 = pBuffer[0];
+       return u16.u16;
+}
+
+FF_INLINE FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) {
+       FF_T_UN32 u32;
+       pBuffer += aOffset;
+       u32.bytes.u8_3 = pBuffer[3];
+       u32.bytes.u8_2 = pBuffer[2];
+       u32.bytes.u8_1 = pBuffer[1];
+       u32.bytes.u8_0 = pBuffer[0];
+       return u32.u32;
+}
+
+FF_INLINE void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 
Value) {
+       pBuffer[aOffset] = Value;
+}
+
+FF_INLINE void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, 
FF_T_UINT16 Value) {
+       FF_T_UN16 u16;
+       u16.u16 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u16.bytes.u8_0;
+       pBuffer[1] = u16.bytes.u8_1;
+}
+
+FF_INLINE void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, 
FF_T_UINT32 Value) {
+       FF_T_UN32 u32;
+       u32.u32 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u32.bytes.u8_0;
+       pBuffer[1] = u32.bytes.u8_1;
+       pBuffer[2] = u32.bytes.u8_2;
+       pBuffer[3] = u32.bytes.u8_3;
+}
+
+#else
+
+FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset);
+void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value);
+void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value);
+void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value);
+
+
+#endif
+
+#endif
+

Modified: trunk/reactos/include/reactos/libs/fullfat/fullfat.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/include/reactos/libs/fullfat/fullfat.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/include/reactos/libs/fullfat/fullfat.h [iso-8859-1] (original)
+++ trunk/reactos/include/reactos/libs/fullfat/fullfat.h [iso-8859-1] Sat Apr  
2 15:22:48 2011
@@ -32,6 +32,10 @@
 #ifndef _FULLFAT_H_
 #define _FULLFAT_H_
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #include "ff_config.h"
 #include "ff_ioman.h"
 #include "ff_fat.h"
@@ -41,6 +45,10 @@
 #include "ff_crc.h"
 #include "ff_hash.h"
 #include "ff_string.h"
+//#include "ff_format.h"
 
+#ifdef __cplusplus
+}      // extern "C"
+#endif
 
 #endif

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_dir.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_dir.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_dir.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_dir.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -1769,4 +1769,3 @@
        }while(FF_getChar(EntryBuffer, (FF_T_UINT16)(FF_FAT_DIRENT_ATTRIB)) == 
FF_FAT_ATTR_LFN);
 
 }
-

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_dir.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_dir.h?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_dir.h [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_dir.h [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -43,7 +43,7 @@
 #include "ff_ioman.h"
 #include "ff_blk.h"
 #include "ff_fat.h"
-#include "fat.h"
+#include "ff_fatdef.h"
 #include "ff_memory.h"
 #include "ff_time.h"
 #include "ff_hash.h"

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_fat.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_fat.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_fat.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_fat.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -136,13 +136,13 @@
        FatSectorEntry  = FatOffset % pIoman->pPartition->BlkSize;
        
        LBAadjust               = (FF_T_UINT8)  (FatSectorEntry / 
pIoman->BlkSize);
-       relClusterEntry = (FF_T_UINT16) (FatSectorEntry % pIoman->BlkSize);
+       relClusterEntry = (FF_T_UINT32) (FatSectorEntry % pIoman->BlkSize);
        
        FatSector = FF_getRealLBA(pIoman, FatSector);
        
 #ifdef FF_FAT12_SUPPORT
        if(pIoman->pPartition->Type == FF_T_FAT12) {
-               if(relClusterEntry == (pIoman->BlkSize - 1)) {
+               if(relClusterEntry == (FF_T_UINT32)(pIoman->BlkSize - 1)) {
                        // Fat Entry SPANS a Sector!
                        // First Buffer get the last Byte in buffer (first byte 
of our address)!
                        pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, 
FF_MODE_READ);
@@ -333,7 +333,7 @@
        FF_T_UINT32 FatSectorEntry;
        FF_T_UINT32 FatEntry;
        FF_T_UINT8      LBAadjust;
-       FF_T_UINT16 relClusterEntry;
+       FF_T_UINT32 relClusterEntry;
 #ifdef FF_FAT12_SUPPORT        
        FF_T_UINT8      F12short[2];            // For FAT12 FAT Table Across 
sector boundary traversal.
 #endif
@@ -350,13 +350,13 @@
        FatSectorEntry = FatOffset % pIoman->pPartition->BlkSize;
        
        LBAadjust = (FF_T_UINT8) (FatSectorEntry / pIoman->BlkSize);
-       relClusterEntry = (FF_T_UINT16)(FatSectorEntry % pIoman->BlkSize);
+       relClusterEntry = (FF_T_UINT32)(FatSectorEntry % pIoman->BlkSize);
        
        FatSector = FF_getRealLBA(pIoman, FatSector);
 
 #ifdef FF_FAT12_SUPPORT        
        if(pIoman->pPartition->Type == FF_T_FAT12) {
-               if(relClusterEntry == (FF_T_UINT16) (pIoman->BlkSize - 1)) {
+               if(relClusterEntry == (FF_T_UINT32)(pIoman->BlkSize - 1)) {
                        // Fat Entry SPANS a Sector!
                        // First Buffer get the last Byte in buffer (first byte 
of our address)!
                        pBuffer = FF_GetBuffer(pIoman, FatSector + LBAadjust, 
FF_MODE_READ);
@@ -497,6 +497,11 @@
        for(i = FatSector; i < pIoman->pPartition->SectorsPerFAT; i++) {
                pBuffer = FF_GetBuffer(pIoman, pIoman->pPartition->FatBeginLBA 
+ i, FF_MODE_READ);
                {
+                       // HT addition: don't use non-existing clusters
+                       if (nCluster >= pIoman->pPartition->NumClusters) {
+                               FF_ReleaseBuffer(pIoman, pBuffer);
+                               return 0;
+                       }
                        for(x = nCluster % EntriesPerSector; x < 
EntriesPerSector; x++) {
                                if(pIoman->pPartition->Type == FF_T_FAT32) {
                                        FatOffset = x * 4;
@@ -612,6 +617,7 @@
        FF_T_UINT32 fatEntry;
        FF_T_UINT32 currentCluster, chainLength = 0;
        FF_T_UINT32     iLen = 0;
+       FF_T_UINT32 lastFree = StartCluster;    /* HT addition : reset 
LastFreeCluster */
 
        fatEntry = StartCluster;
 
@@ -622,9 +628,15 @@
         do {
                        fatEntry = FF_getFatEntry(pIoman, fatEntry);
                        FF_putFatEntry(pIoman, currentCluster, 0x00000000);
+                       if (lastFree > currentCluster) {
+                               lastFree = currentCluster;
+                       }
                        currentCluster = fatEntry;
                        iLen ++;
                }while(!FF_isEndOfChain(pIoman, fatEntry));
+               if (pIoman->pPartition->LastFreeCluster > lastFree) {
+                       pIoman->pPartition->LastFreeCluster = lastFree;
+               }
                FF_IncreaseFreeClusters(pIoman, iLen);
        } else {
                // Truncation - This is quite hard, because we can only do it 
backwards.
@@ -694,7 +706,7 @@
                                } else {
                                        FatOffset = x * 2;
                                        FatSectorEntry  = FatOffset % 
pIoman->pPartition->BlkSize;
-                                       FatEntry = (FF_T_UINT32) 
FF_getShort(pBuffer->pBuffer, (FF_T_UINT16)FatSectorEntry);
+                                       FatEntry = (FF_T_UINT32) 
FF_getShort(pBuffer->pBuffer, FatSectorEntry);
                                }
                                if(FatEntry == 0x00000000) {
                                        FreeClusters += 1;
@@ -706,7 +718,7 @@
                FF_ReleaseBuffer(pIoman, pBuffer);
        }
 
-       return FreeClusters;
+       return FreeClusters <= pIoman->pPartition->NumClusters ? FreeClusters : 
pIoman->pPartition->NumClusters;
 }
 
 #ifdef FF_64_NUM_SUPPORT
@@ -747,4 +759,4 @@
        }
        return 0;
 }
-#endif
+#endif

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_file.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_file.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_file.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_file.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -163,7 +163,7 @@
                }
                return (FF_FILE *)NULL;
        }
-       pFile = FF_Malloc(sizeof(FF_FILE));
+       pFile = FF_MALLOC(sizeof(FF_FILE));
        if(!pFile) {
                if(pError) {
                        *pError = FF_ERR_NOT_ENOUGH_MEMORY;
@@ -222,7 +222,7 @@
                        if(Object.Attrib == FF_FAT_ATTR_DIR) {
                                if(!(pFile->Mode & FF_MODE_DIR)) {
                                        // Not the object, File Not Found!
-                                       FF_Free(pFile);
+                                       FF_FREE(pFile);
                                        if(pError) {
                                                *pError = 
FF_ERR_FILE_OBJECT_IS_A_DIR;
                                        }
@@ -233,7 +233,7 @@
                        //---------- Ensure Read-Only files don't get opened 
for Writing.
                        if((pFile->Mode & FF_MODE_WRITE) || (pFile->Mode & 
FF_MODE_APPEND)) {
                                if((Object.Attrib & FF_FAT_ATTR_READONLY)) {
-                                       FF_Free(pFile);
+                                       FF_FREE(pFile);
                                        if(pError) {
                                                *pError = 
FF_ERR_FILE_IS_READ_ONLY;
                                        }
@@ -276,7 +276,7 @@
                                                if(pFileChain->ObjectCluster == 
pFile->ObjectCluster) {
                                                        // File is already 
open! DON'T ALLOW IT!
                                                        
FF_ReleaseSemaphore(pIoman->pSemaphore);
-                                                       FF_Free(pFile);
+                                                       FF_FREE(pFile);
                                                        if(pError) {
                                                                *pError = 
FF_ERR_FILE_ALREADY_OPEN;
                                                        }
@@ -294,7 +294,7 @@
 
                        return pFile;
                }else {
-                       FF_Free(pFile);
+                       FF_FREE(pFile);
                        if(pError) {
                                *pError = FF_ERR_FILE_NOT_FOUND;
                        }
@@ -305,7 +305,7 @@
                *pError = FF_ERR_FILE_INVALID_PATH;
        }
 
-       FF_Free(pFile);
+       FF_FREE(pFile);
 
        return (FF_FILE *)NULL;
 }
@@ -600,7 +600,14 @@
 
                do {
                        if(pFile->pIoman->pBlkDevice->fnReadBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                               FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
+                               // Called from FF_Read, sem not claimed
                                RetVal = 
pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, Sectors, 
pFile->pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                               FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
                                        FF_Sleep(FF_DRIVER_BUSY_SLEEP);
@@ -703,7 +710,14 @@
 
                do {
                        if(pFile->pIoman->pBlkDevice->fnWriteBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                               FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
+                               // Called from FF_Write, sem not claimed
                                RetVal = 
pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, Sectors, 
pFile->pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                               FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
                                        FF_Sleep(FF_DRIVER_BUSY_SLEEP);
@@ -832,7 +846,13 @@
                        
                        do {
                                if(pIoman->pBlkDevice->fnReadBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                        RetVal = 
pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, 
pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                }
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
@@ -887,7 +907,13 @@
                        
                        do {
                                if(pIoman->pBlkDevice->fnReadBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                        RetVal = 
pFile->pIoman->pBlkDevice->fnReadBlocks(buffer, nItemLBA, sSectors, 
pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                }
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
@@ -1116,7 +1142,13 @@
                        
                        do {
                                if(pIoman->pBlkDevice->fnWriteBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                        RetVal = 
pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, 
pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                }
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
@@ -1174,7 +1206,13 @@
                        
                        do {
                                if(pIoman->pBlkDevice->fnWriteBlocks) {
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_PendSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                        RetVal = 
pFile->pIoman->pBlkDevice->fnWriteBlocks(buffer, nItemLBA, sSectors, 
pIoman->pBlkDevice->pParam);
+#ifdef FF_BLKDEV_USES_SEM
+                                       
FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
+#endif
                                }
                                if(RetVal == FF_ERR_DRIVER_BUSY) {
                                        FF_Yield();
@@ -1405,7 +1443,7 @@
        FF_ReleaseSemaphore(pFile->pIoman->pSemaphore);
 
        // If file written, flush to disk
-       FF_Free(pFile);
+       FF_FREE(pFile);
        // Simply free the pointer!
        return FF_ERR_NONE;
 }

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_hash.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_hash.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_hash.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_hash.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -53,7 +53,7 @@
  *
  **/
 FF_HASH_TABLE FF_CreateHashTable() {
-       FF_HASH_TABLE pHash = (FF_HASH_TABLE) FF_Malloc(sizeof(struct 
_FF_HASH_TABLE));
+       FF_HASH_TABLE pHash = (FF_HASH_TABLE) FF_MALLOC(sizeof(struct 
_FF_HASH_TABLE));
 
        if(pHash) {
                FF_ClearHashTable(pHash);
@@ -110,7 +110,7 @@
 
 FF_ERROR FF_DestroyHashTable(FF_HASH_TABLE pHash) {
        if(pHash) {
-               free(pHash);
+               FF_FREE(pHash);
                return FF_ERR_NONE;
        }
        return FF_ERR_NULL_POINTER;

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_ioman.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_ioman.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_ioman.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_ioman.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -42,8 +42,10 @@
  *     Destroying a FullFAT IO object.
  **/
 
+#include <string.h>
+
 #include "ff_ioman.h"  // Includes ff_types.h, ff_safety.h, <stdio.h>
-#include "fat.h"
+#include "ff_fatdef.h"
 
 extern FF_T_UINT32 FF_FindFreeCluster          (FF_IOMAN *pIoman);
 extern FF_T_UINT32 FF_CountFreeClusters                (FF_IOMAN *pIoman);
@@ -89,7 +91,7 @@
                return NULL;    // Memory Size not a multiple of BlkSize > 0
        }
 
-       pIoman = (FF_IOMAN *) FF_Malloc(sizeof(FF_IOMAN));
+       pIoman = (FF_IOMAN *) FF_MALLOC(sizeof(FF_IOMAN));
 
        if(!pIoman) {           // Ensure malloc() succeeded.
                if(pError) {
@@ -98,62 +100,68 @@
                return NULL;
        }
 
+       memset (pIoman, '\0', sizeof(FF_IOMAN));
+
        // This is just a bit-mask, to use a byte to keep track of memory.
        // pIoman->MemAllocation = 0x00;        // Unset all allocation 
identifiers.
-       pIoman->pBlkDevice      = NULL;
-       pIoman->pBuffers        = NULL;
-       pIoman->pCacheMem       = NULL;
-       pIoman->pPartition      = NULL;
-       pIoman->pSemaphore      = NULL;
-
-       pIoman->pPartition      = (FF_PARTITION  *) 
FF_Malloc(sizeof(FF_PARTITION));
-       if(pIoman->pPartition) {        // If succeeded, flag that allocation.
-               pIoman->MemAllocation |= FF_IOMAN_ALLOC_PART;
-               pIoman->pPartition->LastFreeCluster = 0;
-               pIoman->pPartition->PartitionMounted = FF_FALSE;        // This 
should be checked by FF_Open();
-#ifdef FF_PATH_CACHE
-               pIoman->pPartition->PCIndex = 0;
-               for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) {
-                       pIoman->pPartition->PathCache[i].DirCluster = 0;
-                       pIoman->pPartition->PathCache[i].Path[0] = '\0';
-#ifdef FF_HASH_TABLE_SUPPORT
-                       pIoman->pPartition->PathCache[i].pHashTable = 
FF_CreateHashTable();
-                       pIoman->pPartition->PathCache[i].bHashed = FF_FALSE;
-#endif
-               }
-#endif
-       } else {
+       pIoman->pPartition      = (FF_PARTITION  *) 
FF_MALLOC(sizeof(FF_PARTITION));
+       if(!pIoman->pPartition) {
+               if(pError) {
+                       *pError = FF_ERR_NOT_ENOUGH_MEMORY;
+               }
                FF_DestroyIOMAN(pIoman);
                return NULL;
        }
-
-       pIoman->pBlkDevice      = (FF_BLK_DEVICE *) 
FF_Malloc(sizeof(FF_BLK_DEVICE));
-       if(pIoman->pBlkDevice) {        // If succeeded, flag that allocation.
-               pIoman->MemAllocation |= FF_IOMAN_ALLOC_BLKDEV;
-
-               // Make sure all pointers are NULL
-               pIoman->pBlkDevice->fnReadBlocks = NULL;
-               pIoman->pBlkDevice->fnWriteBlocks = NULL;
-               pIoman->pBlkDevice->pParam = NULL;
-
-       } else {
+       memset (pIoman->pPartition, '\0', sizeof(FF_PARTITION));
+
+       pIoman->MemAllocation |= FF_IOMAN_ALLOC_PART;   // If succeeded, flag 
that allocation.
+       pIoman->pPartition->LastFreeCluster = 0;
+       pIoman->pPartition->PartitionMounted = FF_FALSE;        // This should 
be checked by FF_Open();
+#ifdef FF_PATH_CACHE
+       pIoman->pPartition->PCIndex = 0;
+       for(i = 0; i < FF_PATH_CACHE_DEPTH; i++) {
+               pIoman->pPartition->PathCache[i].DirCluster = 0;
+               pIoman->pPartition->PathCache[i].Path[0] = '\0';
+#ifdef FF_HASH_TABLE_SUPPORT
+               pIoman->pPartition->PathCache[i].pHashTable = 
FF_CreateHashTable();
+               pIoman->pPartition->PathCache[i].bHashed = FF_FALSE;
+#endif
+       }
+#endif
+
+       pIoman->pBlkDevice      = (FF_BLK_DEVICE *) 
FF_MALLOC(sizeof(FF_BLK_DEVICE));
+       if(!pIoman->pBlkDevice) {       // If succeeded, flag that allocation.
+               if(pError) {
+                       *pError = FF_ERR_NOT_ENOUGH_MEMORY;
+               }
                FF_DestroyIOMAN(pIoman);
                return NULL;
        }
+       memset (pIoman->pBlkDevice, '\0', sizeof(FF_BLK_DEVICE));
+       pIoman->MemAllocation |= FF_IOMAN_ALLOC_BLKDEV;
+
+       // Make sure all pointers are NULL
+       pIoman->pBlkDevice->fnReadBlocks = NULL;
+       pIoman->pBlkDevice->fnWriteBlocks = NULL;
+       pIoman->pBlkDevice->pParam = NULL;
 
        // Organise the memory provided, or create our own!
        if(pCacheMem) {
                pIoman->pCacheMem = pCacheMem;
        }else { // No-Cache buffer provided (malloc)
-               pLong = (FF_T_UINT32 *) FF_Malloc(Size);
+               pLong = (FF_T_UINT32 *) FF_MALLOC(Size);
                pIoman->pCacheMem = (FF_T_UINT8 *) pLong;
                if(!pIoman->pCacheMem) {
-                       pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFFERS;
+                       if(pError) {
+                               *pError = FF_ERR_NOT_ENOUGH_MEMORY;
+                       }
                        FF_DestroyIOMAN(pIoman);
                        return NULL;
                }
-
-       }
+               pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFFERS;
+
+       }
+       memset (pIoman->pCacheMem, '\0', Size);
 
        pIoman->BlkSize          = BlkSize;
        pIoman->CacheSize        = (FF_T_UINT16) (Size / BlkSize);
@@ -163,14 +171,19 @@
        /*      Malloc() memory for buffer objects. (FullFAT never refers to a 
buffer directly
                but uses buffer objects instead. Allows us to provide thread 
safety.
        */
-       pIoman->pBuffers = (FF_BUFFER *) FF_Malloc(sizeof(FF_BUFFER) * 
pIoman->CacheSize);
-
-       if(pIoman->pBuffers) {
-               pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFDESCR;
-               FF_IOMAN_InitBufferDescriptors(pIoman);
-       } else {
+       pIoman->pBuffers = (FF_BUFFER *) FF_MALLOC(sizeof(FF_BUFFER) * 
pIoman->CacheSize);
+
+       if(!pIoman->pBuffers) {
+               if(pError) {
+                       *pError = FF_ERR_NOT_ENOUGH_MEMORY;
+               }
                FF_DestroyIOMAN(pIoman);
-       }
+               return NULL;    // HT added
+       }
+       memset (pIoman->pBuffers, '\0', sizeof(FF_BUFFER) * pIoman->CacheSize);
+
+       pIoman->MemAllocation |= FF_IOMAN_ALLOC_BUFDESCR;
+       FF_IOMAN_InitBufferDescriptors(pIoman);
 
        // Finally create a Semaphore for Buffer Description modifications.
        pIoman->pSemaphore = FF_CreateSemaphore();
@@ -196,22 +209,22 @@
 
        // Ensure pPartition pointer was allocated.
        if((pIoman->MemAllocation & FF_IOMAN_ALLOC_PART)) {
-               FF_Free(pIoman->pPartition);
+               FF_FREE(pIoman->pPartition);
        }
 
        // Ensure pBlkDevice pointer was allocated.
        if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BLKDEV)) {
-               FF_Free(pIoman->pBlkDevice);
+               FF_FREE(pIoman->pBlkDevice);
        }
 
        // Ensure pBuffers pointer was allocated.
        if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BUFDESCR)) {
-               FF_Free(pIoman->pBuffers);
+               FF_FREE(pIoman->pBuffers);
        }
 
        // Ensure pCacheMem pointer was allocated.
        if((pIoman->MemAllocation & FF_IOMAN_ALLOC_BUFFERS)) {
-               FF_Free(pIoman->pCacheMem);
+               FF_FREE(pIoman->pCacheMem);
        }
 
        // Destroy any Semaphore that was created.
@@ -220,7 +233,7 @@
        }
 
        // Finally free the FF_IOMAN object.
-       FF_Free(pIoman);
+       FF_FREE(pIoman);
 
        return FF_ERR_NONE;
 }
@@ -236,15 +249,9 @@
        FF_T_UINT16 i;
        FF_BUFFER *pBuffer = pIoman->pBuffers;
        pIoman->LastReplaced = 0;
+       // HT : it is assmued that pBuffer was cleared by memset ()
        for(i = 0; i < pIoman->CacheSize; i++) {
-               pBuffer->Mode                   = 0;
-               pBuffer->NumHandles     = 0;
-               pBuffer->Persistance    = 0;
-               pBuffer->LRU                    = 0;
-               pBuffer->Sector                 = 0;
                pBuffer->pBuffer                = (FF_T_UINT8 
*)((pIoman->pCacheMem) + (pIoman->BlkSize * i));
-               pBuffer->Modified               = FF_FALSE;
-               pBuffer->Valid                  = FF_FALSE;
                pBuffer++;
        }
 }
@@ -272,6 +279,8 @@
  *     @param  pIoman  FF_IOMAN object.
  *     @param  Sector  LBA address of the sector to fetch.
  *     @param  pBuffer Pointer to a byte-wise buffer to store the fetched data.
+ *
+ *     HT Note: will be called while semaphore claimed (by FF_GetBuffer)
  *
  *     @return FF_TRUE when valid, else FF_FALSE.
  **/
@@ -279,6 +288,7 @@
        FF_T_SINT32 retVal = 0;
        if(pIoman->pBlkDevice->fnReadBlocks) {  // Make sure we don't execute a 
NULL.
                 do{
+                       // Called from FF_GetBuffer with semaphore claimed
                        retVal = pIoman->pBlkDevice->fnReadBlocks(pBuffer, 
Sector, 1, pIoman->pBlkDevice->pParam);
                        if(retVal == FF_ERR_DRIVER_BUSY) {
                                FF_Sleep(FF_DRIVER_BUSY_SLEEP);
@@ -306,9 +316,13 @@
  *     @param  Sector  LBA address of the sector to fetch.
  *     @param  pBuffer Pointer to a byte-wise buffer to store the fetched data.
  *
+ *
+ *  HT made it a globally accesible function to be used by new module 
ff_format.c
+ *  Note that this function is called when semaphore is already locked
+ *
  *     @return FF_TRUE when valid, else FF_FALSE.
  **/
-static FF_ERROR FF_IOMAN_FlushBuffer(FF_IOMAN *pIoman, FF_T_UINT32 Sector, 
FF_T_UINT8 *pBuffer) {
+/* static */ FF_ERROR FF_IOMAN_FlushBuffer(FF_IOMAN *pIoman, FF_T_UINT32 
Sector, FF_T_UINT8 *pBuffer) {
        FF_T_SINT32 retVal = 0;
        if(pIoman->pBlkDevice->fnWriteBlocks) { // Make sure we don't execute a 
NULL.
                 do{
@@ -481,7 +495,7 @@
                        }
                }
                FF_ReleaseSemaphore(pIoman->pSemaphore);
-               FF_Yield();
+               FF_Yield();     // Better to go asleep to give low-priority 
task a chance to release buffer(s)
        }
 
        return pBufMatch;       // Return the Matched Buffer!
@@ -500,7 +514,11 @@
        // Protect description changes with a semaphore.
        FF_PendSemaphore(pIoman->pSemaphore);
        {
-               pBuffer->NumHandles--;
+               if (pBuffer->NumHandles) {
+                       pBuffer->NumHandles--;
+               } else {
+                       //printf ("FF_ReleaseBuffer: buffer not claimed\n");
+               }
        }
        FF_ReleaseSemaphore(pIoman->pSemaphore);
 }
@@ -630,6 +648,34 @@
 
        return FF_ERR_IOMAN_NOT_FAT_FORMATTED;
 }
+
+static FF_T_SINT8 FF_PartitionCount (FF_T_UINT8 *pBuffer)
+{
+       FF_T_SINT8 count = 0;
+       FF_T_SINT8 part;
+       // Check PBR or MBR signature
+       if (FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0x55 &&
+               FF_getChar(pBuffer, FF_FAT_MBR_SIGNATURE) != 0xAA ) {
+               // No MBR, but is it a PBR ?
+               if (FF_getChar(pBuffer, 0) == 0xEB &&          // PBR Byte 0
+                   FF_getChar(pBuffer, 2) == 0x90 &&          // PBR Byte 2
+                   (FF_getChar(pBuffer, 21) & 0xF0) == 0xF0) {// PBR Byte 21 : 
Media byte
+                       return 1;       // No MBR but PBR exist then only one 
partition
+               }
+               return 0;   // No MBR and no PBR then no partition found
+       }
+       for (part = 0; part < 4; part++)  {
+               FF_T_UINT8 active = FF_getChar(pBuffer, FF_FAT_PTBL + 
FF_FAT_PTBL_ACTIVE + (16 * part));
+               FF_T_UINT8 part_id = FF_getChar(pBuffer, FF_FAT_PTBL + 
FF_FAT_PTBL_ID + (16 * part));
+               // The first sector must be a MBR, then check the partition 
entry in the MBR
+               if (active != 0x80 && (active != 0 || part_id == 0)) {
+                       break;
+               }
+               count++;
+       }
+       return count;
+}
+
 /**
  *     @public
  *     @brief  Mounts the Specified partition, the volume specified by the 
FF_IOMAN object provided.
@@ -651,6 +697,7 @@
 FF_ERROR FF_MountPartition(FF_IOMAN *pIoman, FF_T_UINT8 PartitionNumber) {
        FF_PARTITION    *pPart;
        FF_BUFFER               *pBuffer = 0;
+       int partCount;
 
        if(!pIoman) {
                return FF_ERR_NULL_POINTER;
@@ -661,19 +708,28 @@
        }
 
        pPart = pIoman->pPartition;
+
+       memset (pIoman->pBuffers, '\0', sizeof(FF_BUFFER) * pIoman->CacheSize);
+       memset (pIoman->pCacheMem, '\0', pIoman->BlkSize * pIoman->CacheSize);
+
+       FF_IOMAN_InitBufferDescriptors(pIoman);
+       pIoman->FirstFile = 0;
 
        pBuffer = FF_GetBuffer(pIoman, 0, FF_MODE_READ);
        if(!pBuffer) {
                return FF_ERR_DEVICE_DRIVER_FAILED;
        }
+
+       partCount = FF_PartitionCount (pBuffer->pBuffer);
+
        pPart->BlkSize = FF_getShort(pBuffer->pBuffer, FF_FAT_BYTES_PER_SECTOR);
 
-       if((pPart->BlkSize % 512) == 0 && pPart->BlkSize > 0) {
+       if (partCount == 0) { //(pPart->BlkSize % 512) == 0 && pPart->BlkSize > 
0) {
                // Volume is not partitioned (MBR Found)
                pPart->BeginLBA = 0;
        } else {
                // Primary Partitions to deal with!
-               pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, 
(FF_T_UINT16)(FF_FAT_PTBL + FF_FAT_PTBL_LBA + (16 * PartitionNumber)));
+               pPart->BeginLBA = FF_getLong(pBuffer->pBuffer, FF_FAT_PTBL + 
FF_FAT_PTBL_LBA + (16 * PartitionNumber));
                FF_ReleaseBuffer(pIoman, pBuffer);
 
                if(!pPart->BeginLBA) {
@@ -690,6 +746,7 @@
                        return FF_ERR_IOMAN_INVALID_FORMAT;
                }
        }
+
        // Assume FAT16, then we'll adjust if its FAT32
        pPart->ReservedSectors = FF_getShort(pBuffer->pBuffer, 
FF_FAT_RESERVED_SECTORS);
        pPart->FatBeginLBA = pPart->BeginLBA + pPart->ReservedSectors;
@@ -709,6 +766,7 @@
                if(pPart->TotalSectors == 0) {
                        pPart->TotalSectors = FF_getLong(pBuffer->pBuffer, 
FF_FAT_32_TOTAL_SECTORS);
                }
+               memcpy (pPart->VolLabel, pBuffer->pBuffer + 
FF_FAT_32_VOL_LABEL, sizeof pPart->VolLabel);
        } else {        // FAT16
                pPart->ClusterBeginLBA  = pPart->BeginLBA + 
pPart->ReservedSectors + (pPart->NumFATS * pPart->SectorsPerFAT);
                pPart->TotalSectors             = (FF_T_UINT32) 
FF_getShort(pBuffer->pBuffer, FF_FAT_16_TOTAL_SECTORS);
@@ -716,6 +774,7 @@
                if(pPart->TotalSectors == 0) {
                        pPart->TotalSectors = FF_getLong(pBuffer->pBuffer, 
FF_FAT_32_TOTAL_SECTORS);
                }
+               memcpy (pPart->VolLabel, pBuffer->pBuffer + 
FF_FAT_16_VOL_LABEL, sizeof pPart->VolLabel);
        }
 
        FF_ReleaseBuffer(pIoman, pBuffer);      // Release the buffer finally!

Modified: trunk/reactos/lib/3rdparty/fullfat/ff_memory.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/3rdparty/fullfat/ff_memory.c?rev=51227&r1=51226&r2=51227&view=diff
==============================================================================
--- trunk/reactos/lib/3rdparty/fullfat/ff_memory.c [iso-8859-1] (original)
+++ trunk/reactos/lib/3rdparty/fullfat/ff_memory.c [iso-8859-1] Sat Apr  2 
15:22:48 2011
@@ -48,87 +48,55 @@
 #include "ff_memory.h"
 #include "ff_config.h"
 
-#ifdef FF_LITTLE_ENDIAN
+/*
+ * HT inlined these functions
+ *
+ * Not much left for the C-module
+ */
 
-/**
- *     @public
- *     @brief  8 bit memory access routines. 
- **/
-/*
-       These functions swap the byte-orders of shorts and longs. A getChar 
function is provided
-       incase there is a system that doesn't have byte-wise access to all 
memory.
 
-       These functions can be replaced with your own platform specific 
byte-order swapping routines
-       for more efficiency.
-
-       The provided functions should work on almost all platforms.
-*/
-FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-       return (FF_T_UINT8) (pBuffer[offset]);
+#ifndef FF_INLINE_MEMORY_ACCESS
+FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) {
+       return (FF_T_UINT8) (pBuffer[aOffset]);
 }
 
-FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-       return (FF_T_UINT16) (pBuffer[offset] & 0x00FF) | ((FF_T_UINT16) 
(pBuffer[offset+1] << 8) & 0xFF00);
+FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) {
+       FF_T_UN16 u16;
+       pBuffer += aOffset;
+       u16.bytes.u8_1 = pBuffer[1];
+       u16.bytes.u8_0 = pBuffer[0];
+       return u16.u16;
 }
 
-FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-       return (FF_T_UINT32) (pBuffer[offset] & 0x000000FF) | ((FF_T_UINT32) 
(pBuffer[offset+1] << 8) & 0x0000FF00) | ((FF_T_UINT32) (pBuffer[offset+2] << 
16) & 0x00FF0000) | ((FF_T_UINT32) (pBuffer[offset+3] << 24) & 0xFF000000);
+FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset) {
+       FF_T_UN32 u32;
+       pBuffer += aOffset;
+       u32.bytes.u8_3 = pBuffer[3];
+       u32.bytes.u8_2 = pBuffer[2];
+       u32.bytes.u8_1 = pBuffer[1];
+       u32.bytes.u8_0 = pBuffer[0];
+       return u32.u32;
 }
 
-void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value) {
-       pBuffer[offset] = Value;
+void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT8 Value) {
+       pBuffer[aOffset] = Value;
 }
 
-void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value) {
-       FF_T_UINT8 *Val         = (FF_T_UINT8 *) &Value;
-       pBuffer[offset]         = Val[0];
-       pBuffer[offset + 1] = Val[1];
+void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT16 Value) {
+       FF_T_UN16 u16;
+       u16.u16 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u16.bytes.u8_0;
+       pBuffer[1] = u16.bytes.u8_1;
 }
 
-void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value) {
-       FF_T_UINT8 *Val         = (FF_T_UINT8 *) &Value;
-       pBuffer[offset]         = Val[0];
-       pBuffer[offset + 1] = Val[1];
-       pBuffer[offset + 2] = Val[2];
-       pBuffer[offset + 3] = Val[3];
-}
-
-#endif
-
-#ifdef FF_BIG_ENDIAN
-/*
-       These haven't been tested or checked. They should work in theory :)
-       Please contact [email protected] if they don't work, and also any fix.
-*/
-FF_T_UINT8 FF_getChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-        return (FF_T_UINT8) (pBuffer[offset]);
-}
-
-FF_T_UINT16 FF_getShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-        return (FF_T_UINT16) ((pBuffer[offset] & 0xFF00)  << 8) | 
((FF_T_UINT16) (pBuffer[offset+1]) & 0x00FF);
-}
-
-FF_T_UINT32 FF_getLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset) {
-        return (FF_T_UINT32) ((pBuffer[offset] << 24) & 0xFF0000) | 
((FF_T_UINT32) (pBuffer[offset+1] << 16) & 0x00FF0000) | ((FF_T_UINT32) 
(pBuffer[offset+2] << 8) & 0x0000FF00) | ((FF_T_UINT32) (pBuffer[offset+3]) & 
0x000000FF);
-}
-
-void FF_putChar(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT8 Value) {
-       pBuffer[offset] = Value;
-}
-
-void FF_putShort(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT16 Value) {
-       FF_T_UINT8 *Val         = (FF_T_UINT8 *) &Value;
-       pBuffer[offset]         = Val[1];
-       pBuffer[offset + 1] = Val[0];
-}
-
-void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT16 offset, FF_T_UINT32 Value) {
-    FF_T_UINT8 *Val            = (FF_T_UINT8 *) &Value;
-       pBuffer[offset]         = Val[3];
-       pBuffer[offset + 1] = Val[2];
-       pBuffer[offset + 2] = Val[1];
-       pBuffer[offset + 3] = Val[0];
+void FF_putLong(FF_T_UINT8 *pBuffer, FF_T_UINT32 aOffset, FF_T_UINT32 Value) {
+       FF_T_UN32 u32;
+       u32.u32 = Value;
+       pBuffer += aOffset;
+       pBuffer[0] = u32.bytes.u8_0;
+       pBuffer[1] = u32.bytes.u8_1;
+       pBuffer[2] = u32.bytes.u8_2;
+       pBuffer[3] = u32.bytes.u8_3;
 }
 #endif
-
-


Reply via email to