diff options
| author | gkostka <kostka.grzegorz@gmail.com> | 2013-10-27 11:48:48 +0000 |
|---|---|---|
| committer | gkostka <kostka.grzegorz@gmail.com> | 2013-10-27 11:48:48 +0000 |
| commit | c109281525bd972c75050db10980fe42ffdc80b7 (patch) | |
| tree | c086ac1a5e2becf535fe09d5ea8e480e73511699 /blockdev | |
| parent | 5aa75f97a60f95b53a11caf31044363434227f07 (diff) | |
FEATURES:
1. New io_raw block device. Allows to access windows partitions.
2. Demo app timings. Windows ext2/3/4 volume access.
3. Faster big file read/write operations (multi block mode).
Diffstat (limited to 'blockdev')
| -rw-r--r-- | blockdev/filedev/ext4_filedev.c | 4 | ||||
| -rw-r--r-- | blockdev/io_raw/io_raw.c | 202 | ||||
| -rw-r--r-- | blockdev/io_raw/io_raw.h | 46 |
3 files changed, 250 insertions, 2 deletions
diff --git a/blockdev/filedev/ext4_filedev.c b/blockdev/filedev/ext4_filedev.c index 091ae6b..bc88c90 100644 --- a/blockdev/filedev/ext4_filedev.c +++ b/blockdev/filedev/ext4_filedev.c @@ -33,7 +33,7 @@ #include <string.h> /**@brief Default filename.*/ -const char *fname = "ext2"; +static const char *fname = "ext2"; /**@brief Image block size.*/ #define EXT4_FILEDEV_BSIZE 512 @@ -71,7 +71,7 @@ static int filedev_open(struct ext4_blockdev *bdev) dev_file = fopen(fname, "r+b"); if(!dev_file) - return ENOENT; + return EIO; if(fseek(dev_file, 0, SEEK_END)) return EFAULT; diff --git a/blockdev/io_raw/io_raw.c b/blockdev/io_raw/io_raw.c new file mode 100644 index 0000000..febd832 --- /dev/null +++ b/blockdev/io_raw/io_raw.c @@ -0,0 +1,202 @@ +/*
+ * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <ext4_config.h>
+#include <ext4_blockdev.h>
+#include <ext4_errno.h>
+#include <stdio.h>
+#include <stdbool.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <winioctl.h>
+
+
+/**@brief Default filename.*/
+static const char *fname = "ext2";
+
+/**@brief IO block size.*/
+#define EXT4_IORAW_BSIZE 512
+
+/**@brief Image file descriptor.*/
+static HANDLE dev_file;
+
+
+/**********************BLOCKDEV INTERFACE**************************************/
+static int io_raw_open(struct ext4_blockdev *bdev);
+static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id,
+ uint32_t blk_cnt);
+static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf,
+ uint64_t blk_id, uint32_t blk_cnt);
+static int io_raw_close(struct ext4_blockdev *bdev);
+
+
+
+
+/******************************************************************************/
+EXT4_BLOCKDEV_STATIC_INSTANCE(
+ _filedev,
+ EXT4_IORAW_BSIZE,
+ 0,
+ io_raw_open,
+ io_raw_bread,
+ io_raw_bwrite,
+ io_raw_close
+);
+
+/******************************************************************************/
+EXT4_BCACHE_STATIC_INSTANCE(__cache, 8, 1024);
+
+/******************************************************************************/
+static int io_raw_open(struct ext4_blockdev *bdev)
+{
+ char path[64];
+ DISK_GEOMETRY pdg;
+ uint64_t disk_size;
+ BOOL bResult = FALSE;
+ DWORD junk;
+
+ sprintf(path, "\\\\.\\%s", fname);
+
+ dev_file = CreateFile (path,
+ GENERIC_READ | GENERIC_WRITE,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL,
+ OPEN_EXISTING,
+ 0,
+ NULL);
+
+ if (dev_file == INVALID_HANDLE_VALUE){
+ return EIO;
+ }
+
+ bResult = DeviceIoControl(dev_file,
+ IOCTL_DISK_GET_DRIVE_GEOMETRY,
+ NULL, 0,
+ &pdg, sizeof(pdg),
+ &junk,
+ (LPOVERLAPPED) NULL);
+
+ if(bResult == FALSE){
+ CloseHandle(dev_file);
+ return EIO;
+ }
+
+
+ disk_size = pdg.Cylinders.QuadPart * (ULONG)pdg.TracksPerCylinder *
+ (ULONG)pdg.SectorsPerTrack * (ULONG)pdg.BytesPerSector;
+
+ _filedev.ph_bsize = pdg.BytesPerSector;
+ _filedev.ph_bcnt = disk_size / pdg.BytesPerSector;
+
+
+ return EOK;
+}
+
+/******************************************************************************/
+
+static int io_raw_bread(struct ext4_blockdev *bdev, void *buf, uint64_t blk_id,
+ uint32_t blk_cnt)
+{
+ long hipart = blk_id >> (32-9);
+ long lopart = blk_id << 9;
+ long err;
+
+ SetLastError (0);
+ lopart = SetFilePointer (dev_file, lopart, &hipart, FILE_BEGIN);
+
+ if (lopart == -1 && NO_ERROR != (err = GetLastError ()))
+ {
+ return EIO;
+ }
+
+ DWORD n;
+
+ if (!ReadFile (dev_file, buf, blk_cnt * 512, &n, NULL))
+ {
+ err = GetLastError ();
+ return EIO;
+ }
+ return EOK;
+}
+
+/******************************************************************************/
+static int io_raw_bwrite(struct ext4_blockdev *bdev, const void *buf,
+ uint64_t blk_id, uint32_t blk_cnt)
+{
+ long hipart = blk_id >> (32-9);
+ long lopart = blk_id << 9;
+ long err;
+
+ SetLastError (0);
+ lopart = SetFilePointer (dev_file, lopart, &hipart, FILE_BEGIN);
+
+ if (lopart == -1 && NO_ERROR != (err = GetLastError ()))
+ {
+ return EIO;
+ }
+
+ DWORD n;
+
+ if (!WriteFile (dev_file, buf, blk_cnt * 512, &n, NULL))
+ {
+ err = GetLastError ();
+ return EIO;
+ }
+ return EOK;
+}
+
+/******************************************************************************/
+static int io_raw_close(struct ext4_blockdev *bdev)
+{
+ CloseHandle(dev_file);
+ return EOK;
+}
+
+
+/******************************************************************************/
+
+struct ext4_bcache* ext4_io_raw_cache_get(void)
+{
+ return &__cache;
+}
+/******************************************************************************/
+struct ext4_blockdev* ext4_io_raw_dev_get(void)
+{
+ return &_filedev;
+}
+/******************************************************************************/
+void ext4_io_raw_filename(const char *n)
+{
+ fname = n;
+}
+
+/******************************************************************************/
+#endif
+
diff --git a/blockdev/io_raw/io_raw.h b/blockdev/io_raw/io_raw.h new file mode 100644 index 0000000..cf097aa --- /dev/null +++ b/blockdev/io_raw/io_raw.h @@ -0,0 +1,46 @@ +/*
+ * Copyright (c) 2013 Grzegorz Kostka (kostka.grzegorz@gmail.com)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#ifndef IO_RAW_H_
+#define IO_RAW_H_
+
+#include <ext4_config.h>
+#include <ext4_blockdev.h>
+
+#include <stdint.h>
+#include <stdbool.h>
+
+
+/**@brief IO raw get.*/
+struct ext4_bcache* ext4_io_raw_cache_get(void);
+
+/**@brief IO raw blockdev get.*/
+struct ext4_blockdev* ext4_io_raw_dev_get(void);
+
+void ext4_io_raw_filename(const char *n);
+
+#endif /* IO_RAW_H_ */
|
