Author: fireball Date: Mon Aug 4 05:00:32 2008 New Revision: 35093
URL: http://svn.reactos.org/svn/reactos?rev=35093&view=rev Log: - Implement read/write support via Native API. - Reorganize headers so that only vfatlib.h is included instead of hundred various different headers.
Modified: trunk/reactos/lib/fslib/vfatlib/check/boot.c trunk/reactos/lib/fslib/vfatlib/check/check.c trunk/reactos/lib/fslib/vfatlib/check/common.c trunk/reactos/lib/fslib/vfatlib/check/fat.c trunk/reactos/lib/fslib/vfatlib/check/file.c trunk/reactos/lib/fslib/vfatlib/check/io.c trunk/reactos/lib/fslib/vfatlib/check/io.h trunk/reactos/lib/fslib/vfatlib/check/lfn.c
Modified: trunk/reactos/lib/fslib/vfatlib/check/boot.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/boo... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/boot.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -5,14 +5,10 @@ /* FAT32, VFAT, Atari format support, and various fixes additions May 1998 * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdio.h> -#include <string.h> -#include <sys/types.h> - -#include "common.h" -#include "dosfsck.h" -#include "io.h" -#include "boot.h" +#include "vfatlib.h" + +#define NDEBUG +#include <debug.h>
#define ROUND_TO_MULTIPLE(n,m) ((n) && (m) ? (n)+(m)-1-((n)-1)%(m) : 0)
Modified: trunk/reactos/lib/fslib/vfatlib/check/check.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/che... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/check.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/check.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -6,20 +6,12 @@ * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <limits.h> +#include "vfatlib.h" #include <time.h> -#include <windows.h> - -#include "common.h" -#include "dosfsck.h" -#include "io.h" -#include "fat.h" -#include "file.h" -#include "lfn.h" -#include "check.h" + +#define NDEBUG +#include <debug.h> +
static DOS_FILE *root;
Modified: trunk/reactos/lib/fslib/vfatlib/check/common.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/com... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/common.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/common.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -6,13 +6,10 @@ * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <stdarg.h> -#include <errno.h> +#include "vfatlib.h"
-#include "common.h" +#define NDEBUG +#include <debug.h>
typedef struct _link {
Modified: trunk/reactos/lib/fslib/vfatlib/check/fat.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/fat... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/fat.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/fat.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -6,16 +6,11 @@ * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdio.h> -#include <stdlib.h> -#include <string.h> -//#include <unistd.h> - -#include "common.h" -#include "dosfsck.h" -#include "io.h" -#include "check.h" -#include "fat.h" +#include "vfatlib.h" + +#define NDEBUG +#include <debug.h> +
//#pragma warning(disable: 4018)
Modified: trunk/reactos/lib/fslib/vfatlib/check/file.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/fil... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/file.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/file.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -6,29 +6,10 @@ * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include <ctype.h> -//#include <unistd.h> - -#define _LINUX_STAT_H /* hack to avoid inclusion of <linux/stat.h> */ -#define _LINUX_STRING_H_ /* hack to avoid inclusion of <linux/string.h>*/ -#define _LINUX_FS_H /* hack to avoid inclusion of <linux/fs.h> */ - -//#include <linux/version.h> -//#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) -//# define __KERNEL__ -//# include <asm/types.h> -//# undef __KERNEL__ -//#endif - -#include "dosfsck.h" -#include "msdos_fs.h" - -#include "common.h" -#include "file.h" - +#include "vfatlib.h" + +#define NDEBUG +#include <debug.h>
FDSC *fp_root = NULL;
Modified: trunk/reactos/lib/fslib/vfatlib/check/io.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/io.... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/io.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/io.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -11,35 +11,11 @@ /* FAT32, VFAT, Atari format support, and various fixes additions May 1998 * by Roman Hodek Roman.Hodek@informatik.uni-erlangen.de */
-#include <stdlib.h> -#include <stdio.h> -#include <string.h> -//#include <unistd.h> -#include <sys/stat.h> -//#include <sys/ioctl.h> -#include <errno.h> -#include <fcntl.h> -#include <assert.h> -//#include <linux/fd.h> - - -#ifdef _WIN32 -#define _WIN32_WINNT 0x0400 -#include <windows.h> -#include <winioctl.h> -#define __LITTLE_ENDIAN 1234 -#define __BIG_ENDIAN 4321 -#define __BYTE_ORDER __LITTLE_ENDIAN -#define inline -#define __attribute__(x) -#define BLOCK_SIZE 512 -#endif - - -#include "dosfsck.h" -#include "common.h" -#include "io.h" - + +#include "vfatlib.h" + +#define NDEBUG +#include <debug.h>
typedef struct _change { void *data; @@ -50,19 +26,19 @@
static CHANGE *changes,*last; -static int fd,did_change = 0; +static int did_change = 0; +static HANDLE fd; +static LARGE_INTEGER CurrentOffset;
unsigned device_no;
-static int WIN32open(const char *path, int oflag, ...); -#define open WIN32open -static int WIN32close(int fd); +static int WIN32close(HANDLE fd); #define close WIN32close -static int WIN32read(int fd, void *buf, unsigned int len); +static int WIN32read(HANDLE fd, void *buf, unsigned int len); #define read WIN32read -static int WIN32write(int fd, void *buf, unsigned int len); +static int WIN32write(HANDLE fd, void *buf, unsigned int len); #define write WIN32write -static loff_t WIN32llseek(int fd, loff_t offset, int whence); +static loff_t WIN32llseek(HANDLE fd, loff_t offset, int whence); #ifdef llseek #undef llseek #endif @@ -70,30 +46,34 @@
//static int is_device = 0;
-void fs_open(char *path,int rw) -{ -#ifdef _WIN32 - static char dev_buf[] = "\\.\X:"; -#else - struct stat stbuf; -#endif - - if (path[1] == ':' && path[2] == '\0') { - dev_buf[4] = path[0]; - path = dev_buf; -// is_device = 1; - } - - if ((fd = open(path,rw ? O_RDWR : O_RDONLY)) < 0) - pdie("open %s",path); +void fs_open(PUNICODE_STRING DriveRoot,int rw) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + + InitializeObjectAttributes(&ObjectAttributes, + DriveRoot, + 0, + NULL, + NULL); + + Status = NtOpenFile(&fd, + FILE_GENERIC_READ | (rw ? FILE_GENERIC_WRITE : 0), + &ObjectAttributes, + &Iosb, + rw ? 0 : FILE_SHARE_READ, + FILE_SYNCHRONOUS_IO_ALERT); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtOpenFile() failed with status 0x%.08x\n", Status); + return; + } + + CurrentOffset.QuadPart = 0LL; + changes = last = NULL; did_change = 0; - -#if 0 - if (fstat(fd,&stbuf) < 0) - pdie("fstat %s",path); - device_no = S_ISBLK(stbuf.st_mode) ? (stbuf.st_rdev >> 8) & 0xff : 0; -#endif }
@@ -224,7 +204,6 @@ static void fs_flush(void) { CHANGE *this; - //int size; int old_write_immed = write_immed;
/* Disable writes to the list now */ @@ -233,19 +212,8 @@ while (changes) { this = changes; changes = changes->next; -#if 0 - if (llseek(fd,this->pos,0) != this->pos) - fprintf(stderr,"Seek to %lld failed: %s\n Did not write %d bytes.\n", - (__int64)this->pos,strerror(errno),this->size); - else if ((size = write(fd,this->data,this->size)) < 0) - fprintf(stderr,"Writing %d bytes at %lld failed: %s\n",this->size, - (__int64)this->pos,strerror(errno)); - else if (size != this->size) - fprintf(stderr,"Wrote %d bytes instead of %d bytes at %lld." - "\n",size,this->size,(__int64)this->pos); -#else + fs_write(this->pos, this->size, this->data); -#endif
free(this->data); free(this); @@ -283,163 +251,64 @@ /* tab-width: 8 */ /* End: */
- -#define O_SHORT_LIVED _O_SHORT_LIVED -//#define O_ACCMODE 3 -#define O_NONE 3 -#define O_BACKUP 0x10000 -#define O_SHARED 0x20000 - -static int WIN32open(const char *path, int oflag, ...) -{ - HANDLE fh; - DWORD desiredAccess = 0; - DWORD shareMode = 0; - DWORD creationDisposition = 0; - DWORD flagsAttributes = FILE_ATTRIBUTE_NORMAL; - SECURITY_ATTRIBUTES securityAttributes; - va_list ap; - int pmode; - int trunc = FALSE; - - securityAttributes.nLength = sizeof(securityAttributes); - securityAttributes.lpSecurityDescriptor = NULL; - securityAttributes.bInheritHandle = oflag & O_NOINHERIT ? FALSE : TRUE; - switch (oflag & O_ACCMODE) { - case O_RDONLY: - desiredAccess = GENERIC_READ; -// shareMode = FILE_SHARE_READ; - shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; // TMN: - break; - case O_WRONLY: - desiredAccess = GENERIC_WRITE; - shareMode = 0; - break; - case O_RDWR: - desiredAccess = GENERIC_READ|GENERIC_WRITE; - shareMode = 0; - break; - case O_NONE: - desiredAccess = 0; - shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; - } - if (oflag & O_APPEND) { - desiredAccess |= FILE_APPEND_DATA|SYNCHRONIZE; - shareMode = FILE_SHARE_READ|FILE_SHARE_WRITE; - } - if (oflag & O_SHARED) - shareMode |= FILE_SHARE_READ|FILE_SHARE_WRITE; - switch (oflag & (O_CREAT|O_EXCL|O_TRUNC)) { - case 0: - case O_EXCL: - creationDisposition = OPEN_EXISTING; - break; - case O_CREAT: - creationDisposition = OPEN_ALWAYS; - break; - case O_CREAT|O_EXCL: - case O_CREAT|O_TRUNC|O_EXCL: - creationDisposition = CREATE_NEW; - break; - case O_TRUNC: - case O_TRUNC|O_EXCL: - creationDisposition = TRUNCATE_EXISTING; - break; - case O_CREAT|O_TRUNC: - creationDisposition = OPEN_ALWAYS; - trunc = TRUE; - break; - } - if (oflag & O_CREAT) { - va_start(ap, oflag); - pmode = va_arg(ap, int); - va_end(ap); - if ((pmode & 0222) == 0) - flagsAttributes |= FILE_ATTRIBUTE_READONLY; - } - if (oflag & O_TEMPORARY) { - flagsAttributes |= FILE_FLAG_DELETE_ON_CLOSE; - desiredAccess |= DELETE; - } - if (oflag & O_SHORT_LIVED) - flagsAttributes |= FILE_ATTRIBUTE_TEMPORARY; - if (oflag & O_SEQUENTIAL) - flagsAttributes |= FILE_FLAG_SEQUENTIAL_SCAN; - else if (oflag & O_RANDOM) - flagsAttributes |= FILE_FLAG_RANDOM_ACCESS; - if (oflag & O_BACKUP) - flagsAttributes |= FILE_FLAG_BACKUP_SEMANTICS; - if ((fh = CreateFile(path, desiredAccess, shareMode, &securityAttributes, - creationDisposition, flagsAttributes, NULL)) == INVALID_HANDLE_VALUE) { - errno = GetLastError(); - return -1; - } - if (trunc) { - if (!SetEndOfFile(fh)) { - errno = GetLastError(); - CloseHandle(fh); - DeleteFile(path); - return -1; - } - } - return (int)fh; -} - -static int WIN32close(int fd) -{ - if (!CloseHandle((HANDLE)fd)) { - errno = GetLastError(); - return -1; - } - return 0; -} - -static int WIN32read(int fd, void *buf, unsigned int len) -{ - DWORD actualLen; - - if (!ReadFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) { - errno = GetLastError(); - if (errno == ERROR_BROKEN_PIPE) - return 0; - else - return -1; - } - return (int)actualLen; -} - -static int WIN32write(int fd, void *buf, unsigned int len) -{ - DWORD actualLen; - - if (!WriteFile((HANDLE)fd, buf, (DWORD)len, &actualLen, NULL)) { - errno = GetLastError(); - return -1; - } - return (int)actualLen; -} - -static loff_t WIN32llseek(int fd, loff_t offset, int whence) -{ - long lo, hi; - DWORD err; - - lo = (long)(offset & 0xffffffff); - hi = (long)(offset >> 32); - lo = SetFilePointer((HANDLE)fd, lo, &hi, whence); - if (lo == 0xFFFFFFFF && (err = GetLastError()) != NO_ERROR) { - errno = err; - return -1; - } - return ((loff_t)hi << 32) | (__u32)lo; -} - -int fsctl(int fd, int code) -{ - DWORD ret; - if (!DeviceIoControl((HANDLE)fd, code, NULL, 0, NULL, 0, &ret, NULL)) { - errno = GetLastError(); - return -1; - } - return 0; -} +static int WIN32close(HANDLE FileHandle) +{ + if (!NT_SUCCESS(NtClose(FileHandle))) return -1; + + return 0; +} + +static int WIN32read(HANDLE FileHandle, void *buf, unsigned int len) +{ + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + Status = NtReadFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + buf, + len, + &CurrentOffset, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtReadFile() failed (Status %lx)\n", Status); + return -1; + } + + CurrentOffset.QuadPart += len; + return (int)len; +} + +static int WIN32write(HANDLE FileHandle, void *buf, unsigned int len) +{ + IO_STATUS_BLOCK IoStatusBlock; + NTSTATUS Status; + + Status = NtWriteFile(FileHandle, + NULL, + NULL, + NULL, + &IoStatusBlock, + buf, + len, + &CurrentOffset, + NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT("NtWriteFile() failed (Status %lx)\n", Status); + return -1; + } + + CurrentOffset.QuadPart += len; + return (int)len; +} + +static loff_t WIN32llseek(HANDLE fd, loff_t offset, int whence) +{ + CurrentOffset.QuadPart = (ULONGLONG)offset; + + return offset; +}
Modified: trunk/reactos/lib/fslib/vfatlib/check/io.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/io.... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/io.h [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/io.h [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -16,7 +16,7 @@ * sufficient (or even better :) for 64 bit offsets in the meantime */ #define llseek lseek
-void fs_open(char *path,int rw); +void fs_open(PUNICODE_STRING DriveRoot,int rw);
/* Opens the file system PATH. If RW is zero, the file system is opened read-only, otherwise, it is opened read-write. */
Modified: trunk/reactos/lib/fslib/vfatlib/check/lfn.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/fslib/vfatlib/check/lfn... ============================================================================== --- trunk/reactos/lib/fslib/vfatlib/check/lfn.c [iso-8859-1] (original) +++ trunk/reactos/lib/fslib/vfatlib/check/lfn.c [iso-8859-1] Mon Aug 4 05:00:32 2008 @@ -2,17 +2,12 @@
/* Written 1998 by Roman Hodek */
-#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <limits.h> -#include <time.h> - -#include "common.h" -#include "io.h" -#include "dosfsck.h" -#include "lfn.h" -#include "file.h" +#include "vfatlib.h" + +#include <limits.h> // for INT_MAX definition + +#define NDEBUG +#include <debug.h>
typedef struct { __u8 id; /* sequence number for slot */