mirror of
https://github.com/reactos/reactos.git
synced 2024-11-23 19:43:31 +08:00
[UBTRFS] Upgrade to 1.4
CORE-16354
This commit is contained in:
parent
318da0c18c
commit
255ef2c332
@ -51,8 +51,8 @@ END
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 1,3,0,0
|
||||
PRODUCTVERSION 1,3,0,0
|
||||
FILEVERSION 1,4,0,0
|
||||
PRODUCTVERSION 1,4,0,0
|
||||
FILEFLAGSMASK 0x17L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@ -68,12 +68,12 @@ BEGIN
|
||||
BLOCK "080904b0"
|
||||
BEGIN
|
||||
VALUE "FileDescription", "Btrfs utility DLL"
|
||||
VALUE "FileVersion", "1.3"
|
||||
VALUE "FileVersion", "1.4"
|
||||
VALUE "InternalName", "ubtrfs"
|
||||
VALUE "LegalCopyright", "Copyright (c) Mark Harmstone 2016-19"
|
||||
VALUE "OriginalFilename", "ubtrfs.dll"
|
||||
VALUE "ProductName", "WinBtrfs"
|
||||
VALUE "ProductVersion", "1.3"
|
||||
VALUE "ProductVersion", "1.4"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
@ -5,7 +5,7 @@ The following FSD are shared with: https://github.com/maharmstone/btrfs.
|
||||
|
||||
reactos/drivers/filesystems/btrfs # Synced to 1.4
|
||||
reactos/dll/shellext/shellbtrfs # Synced to 1.1
|
||||
reactos/sdk/lib/fslib/btrfslib # Synced to 1.3
|
||||
reactos/sdk/lib/fslib/btrfslib # Synced to 1.4
|
||||
|
||||
The following FSD are shared with: http://www.ext2fsd.com/
|
||||
|
||||
|
@ -36,9 +36,11 @@
|
||||
#include <ata.h>
|
||||
#include <mountmgr.h>
|
||||
#ifdef __REACTOS__
|
||||
#include <winnls.h>
|
||||
#include "btrfs.h"
|
||||
#include "btrfsioctl.h"
|
||||
#else
|
||||
#include <stringapiset.h>
|
||||
#include "../btrfs.h"
|
||||
#include "../btrfsioctl.h"
|
||||
#endif
|
||||
@ -62,9 +64,6 @@ NTSTATUS NTAPI NtWriteFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcR
|
||||
|
||||
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer,
|
||||
ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key);
|
||||
|
||||
NTSYSAPI NTSTATUS NTAPI RtlUnicodeToUTF8N(PCHAR UTF8StringDestination, ULONG UTF8StringMaxByteCount, PULONG UTF8StringActualByteCount,
|
||||
PCWCH UnicodeStringSource, ULONG UnicodeStringByteCount);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@ -89,9 +88,9 @@ typedef struct {
|
||||
#define FORMAT_FLAG_INTEGRITY_DISABLE 0x00000100
|
||||
|
||||
typedef struct {
|
||||
UINT16 unk1;
|
||||
UINT16 unk2;
|
||||
UINT32 flags;
|
||||
uint16_t unk1;
|
||||
uint16_t unk2;
|
||||
uint32_t flags;
|
||||
DSTRING* label;
|
||||
} options;
|
||||
|
||||
@ -111,33 +110,27 @@ FORCEINLINE VOID InsertTailList(PLIST_ENTRY ListHead, PLIST_ENTRY Entry) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(__REACTOS__) && (NTDDI_VERSION < NTDDI_WIN7)
|
||||
NTSTATUS NTAPI RtlUnicodeToUTF8N(CHAR *utf8_dest, ULONG utf8_bytes_max,
|
||||
ULONG *utf8_bytes_written,
|
||||
const WCHAR *uni_src, ULONG uni_bytes);
|
||||
#endif /* defined(__REACTOS__) && (NTDDI_VERSION < NTDDI_WIN7) */
|
||||
|
||||
#ifdef __REACTOS__
|
||||
ULONG NTAPI NtGetTickCount(VOID);
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
KEY key;
|
||||
UINT16 size;
|
||||
uint16_t size;
|
||||
void* data;
|
||||
LIST_ENTRY list_entry;
|
||||
} btrfs_item;
|
||||
|
||||
typedef struct {
|
||||
UINT64 offset;
|
||||
uint64_t offset;
|
||||
CHUNK_ITEM* chunk_item;
|
||||
UINT64 lastoff;
|
||||
UINT64 used;
|
||||
uint64_t lastoff;
|
||||
uint64_t used;
|
||||
LIST_ENTRY list_entry;
|
||||
} btrfs_chunk;
|
||||
|
||||
typedef struct {
|
||||
UINT64 id;
|
||||
uint64_t id;
|
||||
tree_header header;
|
||||
btrfs_chunk* c;
|
||||
LIST_ENTRY items;
|
||||
@ -146,7 +139,7 @@ typedef struct {
|
||||
|
||||
typedef struct {
|
||||
DEV_ITEM dev_item;
|
||||
UINT64 last_alloc;
|
||||
uint64_t last_alloc;
|
||||
} btrfs_dev;
|
||||
|
||||
#define keycmp(key1, key2)\
|
||||
@ -160,7 +153,7 @@ typedef struct {
|
||||
|
||||
HMODULE module;
|
||||
ULONG def_sector_size = 0, def_node_size = 0;
|
||||
UINT64 def_incompat_flags = BTRFS_INCOMPAT_FLAGS_EXTENDED_IREF | BTRFS_INCOMPAT_FLAGS_SKINNY_METADATA;
|
||||
uint64_t def_incompat_flags = BTRFS_INCOMPAT_FLAGS_EXTENDED_IREF | BTRFS_INCOMPAT_FLAGS_SKINNY_METADATA;
|
||||
|
||||
// the following definitions come from fmifs.h in ReactOS
|
||||
|
||||
@ -218,7 +211,7 @@ typedef enum {
|
||||
|
||||
typedef BOOLEAN (NTAPI* PFMIFSCALLBACK)(CALLBACKCOMMAND Command, ULONG SubAction, PVOID ActionInfo);
|
||||
|
||||
static const UINT32 crctable[] = {
|
||||
static const uint32_t crctable[] = {
|
||||
0x00000000, 0xf26b8303, 0xe13b70f7, 0x1350f3f4, 0xc79a971f, 0x35f1141c, 0x26a1e7e8, 0xd4ca64eb,
|
||||
0x8ad958cf, 0x78b2dbcc, 0x6be22838, 0x9989ab3b, 0x4d43cfd0, 0xbf284cd3, 0xac78bf27, 0x5e133c24,
|
||||
0x105ec76f, 0xe235446c, 0xf165b798, 0x030e349b, 0xd7c45070, 0x25afd373, 0x36ff2087, 0xc494a384,
|
||||
@ -253,8 +246,8 @@ static const UINT32 crctable[] = {
|
||||
0x79b737ba, 0x8bdcb4b9, 0x988c474d, 0x6ae7c44e, 0xbe2da0a5, 0x4c4623a6, 0x5f16d052, 0xad7d5351,
|
||||
};
|
||||
|
||||
static UINT32 calc_crc32c(UINT32 seed, UINT8* msg, ULONG msglen) {
|
||||
UINT32 rem;
|
||||
static uint32_t calc_crc32c(uint32_t seed, uint8_t* msg, ULONG msglen) {
|
||||
uint32_t rem;
|
||||
ULONG i;
|
||||
|
||||
rem = seed;
|
||||
@ -286,7 +279,7 @@ NTSTATUS NTAPI BtrfsChkdskEx(PUNICODE_STRING DriveRoot, BOOLEAN FixErrors, BOOLE
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static btrfs_root* add_root(LIST_ENTRY* roots, UINT64 id) {
|
||||
static btrfs_root* add_root(LIST_ENTRY* roots, uint64_t id) {
|
||||
btrfs_root* root;
|
||||
|
||||
#ifdef __REACTOS__
|
||||
@ -362,7 +355,7 @@ static void free_chunks(LIST_ENTRY* chunks) {
|
||||
}
|
||||
}
|
||||
|
||||
static void add_item(btrfs_root* r, UINT64 obj_id, UINT8 obj_type, UINT64 offset, void* data, UINT16 size) {
|
||||
static void add_item(btrfs_root* r, uint64_t obj_id, uint8_t obj_type, uint64_t offset, void* data, uint16_t size) {
|
||||
LIST_ENTRY* le;
|
||||
btrfs_item* item;
|
||||
|
||||
@ -403,8 +396,8 @@ static void add_item(btrfs_root* r, UINT64 obj_id, UINT8 obj_type, UINT64 offset
|
||||
InsertTailList(&r->items, &item->list_entry);
|
||||
}
|
||||
|
||||
static UINT64 find_chunk_offset(UINT64 size, UINT64 offset, btrfs_dev* dev, btrfs_root* dev_root, BTRFS_UUID* chunkuuid) {
|
||||
UINT64 off;
|
||||
static uint64_t find_chunk_offset(uint64_t size, uint64_t offset, btrfs_dev* dev, btrfs_root* dev_root, BTRFS_UUID* chunkuuid) {
|
||||
uint64_t off;
|
||||
DEV_EXTENT de;
|
||||
|
||||
off = dev->last_alloc;
|
||||
@ -423,9 +416,9 @@ static UINT64 find_chunk_offset(UINT64 size, UINT64 offset, btrfs_dev* dev, btrf
|
||||
return off;
|
||||
}
|
||||
|
||||
static btrfs_chunk* add_chunk(LIST_ENTRY* chunks, UINT64 flags, btrfs_root* chunk_root, btrfs_dev* dev, btrfs_root* dev_root, BTRFS_UUID* chunkuuid, UINT32 sector_size) {
|
||||
UINT64 off, size;
|
||||
UINT16 stripes, i;
|
||||
static btrfs_chunk* add_chunk(LIST_ENTRY* chunks, uint64_t flags, btrfs_root* chunk_root, btrfs_dev* dev, btrfs_root* dev_root, BTRFS_UUID* chunkuuid, uint32_t sector_size) {
|
||||
uint64_t off, size;
|
||||
uint16_t stripes, i;
|
||||
btrfs_chunk* c;
|
||||
LIST_ENTRY* le;
|
||||
CHUNK_ITEM_STRIPE* cis;
|
||||
@ -497,16 +490,16 @@ static btrfs_chunk* add_chunk(LIST_ENTRY* chunks, UINT64 flags, btrfs_root* chun
|
||||
return c;
|
||||
}
|
||||
|
||||
static BOOL superblock_collision(btrfs_chunk* c, UINT64 address) {
|
||||
static BOOL superblock_collision(btrfs_chunk* c, uint64_t address) {
|
||||
CHUNK_ITEM_STRIPE* cis = (CHUNK_ITEM_STRIPE*)&c->chunk_item[1];
|
||||
UINT64 stripe = (address - c->offset) / c->chunk_item->stripe_length;
|
||||
UINT16 i, j;
|
||||
uint64_t stripe = (address - c->offset) / c->chunk_item->stripe_length;
|
||||
uint16_t i, j;
|
||||
|
||||
for (i = 0; i < c->chunk_item->num_stripes; i++) {
|
||||
j = 0;
|
||||
while (superblock_addrs[j] != 0) {
|
||||
if (superblock_addrs[j] >= cis[i].offset) {
|
||||
UINT64 stripe2 = (superblock_addrs[j] - cis[i].offset) / c->chunk_item->stripe_length;
|
||||
uint64_t stripe2 = (superblock_addrs[j] - cis[i].offset) / c->chunk_item->stripe_length;
|
||||
|
||||
if (stripe2 == stripe)
|
||||
return TRUE;
|
||||
@ -518,8 +511,8 @@ static BOOL superblock_collision(btrfs_chunk* c, UINT64 address) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static UINT64 get_next_address(btrfs_chunk* c) {
|
||||
UINT64 addr;
|
||||
static uint64_t get_next_address(btrfs_chunk* c) {
|
||||
uint64_t addr;
|
||||
|
||||
addr = c->lastoff;
|
||||
|
||||
@ -535,18 +528,18 @@ static UINT64 get_next_address(btrfs_chunk* c) {
|
||||
|
||||
typedef struct {
|
||||
EXTENT_ITEM ei;
|
||||
UINT8 type;
|
||||
uint8_t type;
|
||||
TREE_BLOCK_REF tbr;
|
||||
} EXTENT_ITEM_METADATA;
|
||||
|
||||
typedef struct {
|
||||
EXTENT_ITEM ei;
|
||||
EXTENT_ITEM2 ei2;
|
||||
UINT8 type;
|
||||
uint8_t type;
|
||||
TREE_BLOCK_REF tbr;
|
||||
} EXTENT_ITEM_METADATA2;
|
||||
|
||||
static void assign_addresses(LIST_ENTRY* roots, btrfs_chunk* sys_chunk, btrfs_chunk* metadata_chunk, UINT32 node_size,
|
||||
static void assign_addresses(LIST_ENTRY* roots, btrfs_chunk* sys_chunk, btrfs_chunk* metadata_chunk, uint32_t node_size,
|
||||
btrfs_root* root_root, btrfs_root* extent_root, BOOL skinny) {
|
||||
LIST_ENTRY* le;
|
||||
|
||||
@ -619,9 +612,9 @@ static void assign_addresses(LIST_ENTRY* roots, btrfs_chunk* sys_chunk, btrfs_ch
|
||||
}
|
||||
}
|
||||
|
||||
static NTSTATUS write_data(HANDLE h, UINT64 address, btrfs_chunk* c, void* data, ULONG size) {
|
||||
static NTSTATUS write_data(HANDLE h, uint64_t address, btrfs_chunk* c, void* data, ULONG size) {
|
||||
NTSTATUS Status;
|
||||
UINT16 i;
|
||||
uint16_t i;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
LARGE_INTEGER off;
|
||||
CHUNK_ITEM_STRIPE* cis;
|
||||
@ -639,10 +632,10 @@ static NTSTATUS write_data(HANDLE h, UINT64 address, btrfs_chunk* c, void* data,
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static NTSTATUS write_roots(HANDLE h, LIST_ENTRY* roots, UINT32 node_size, BTRFS_UUID* fsuuid, BTRFS_UUID* chunkuuid) {
|
||||
static NTSTATUS write_roots(HANDLE h, LIST_ENTRY* roots, uint32_t node_size, BTRFS_UUID* fsuuid, BTRFS_UUID* chunkuuid) {
|
||||
LIST_ENTRY *le, *le2;
|
||||
NTSTATUS Status;
|
||||
UINT8* tree;
|
||||
uint8_t* tree;
|
||||
|
||||
#ifndef __REACTOS__
|
||||
tree = malloc(node_size);
|
||||
@ -653,9 +646,9 @@ static NTSTATUS write_roots(HANDLE h, LIST_ENTRY* roots, UINT32 node_size, BTRFS
|
||||
le = roots->Flink;
|
||||
while (le != roots) {
|
||||
btrfs_root* r = CONTAINING_RECORD(le, btrfs_root, list_entry);
|
||||
UINT8* dp;
|
||||
uint8_t* dp;
|
||||
leaf_node* ln;
|
||||
UINT32 crc32;
|
||||
uint32_t crc32;
|
||||
|
||||
memset(tree, 0, node_size);
|
||||
|
||||
@ -694,8 +687,8 @@ static NTSTATUS write_roots(HANDLE h, LIST_ENTRY* roots, UINT32 node_size, BTRFS
|
||||
|
||||
memcpy(tree, &r->header, sizeof(tree_header));
|
||||
|
||||
crc32 = ~calc_crc32c(0xffffffff, (UINT8*)&((tree_header*)tree)->fs_uuid, node_size - sizeof(((tree_header*)tree)->csum));
|
||||
memcpy(tree, &crc32, sizeof(UINT32));
|
||||
crc32 = ~calc_crc32c(0xffffffff, (uint8_t*)&((tree_header*)tree)->fs_uuid, node_size - sizeof(((tree_header*)tree)->csum));
|
||||
memcpy(tree, &crc32, sizeof(uint32_t));
|
||||
|
||||
Status = write_data(h, r->header.address, r->c, tree, node_size);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
@ -724,7 +717,7 @@ static void get_uuid(BTRFS_UUID* uuid) {
|
||||
#else
|
||||
static void get_uuid(BTRFS_UUID* uuid, ULONG* seed) {
|
||||
#endif
|
||||
UINT8 i;
|
||||
uint8_t i;
|
||||
|
||||
for (i = 0; i < 16; i+=2) {
|
||||
#ifndef __REACTOS__
|
||||
@ -739,9 +732,9 @@ static void get_uuid(BTRFS_UUID* uuid, ULONG* seed) {
|
||||
}
|
||||
|
||||
#ifndef __REACTOS__
|
||||
static void init_device(btrfs_dev* dev, UINT64 id, UINT64 size, BTRFS_UUID* fsuuid, UINT32 sector_size) {
|
||||
static void init_device(btrfs_dev* dev, uint64_t id, uint64_t size, BTRFS_UUID* fsuuid, uint32_t sector_size) {
|
||||
#else
|
||||
static void init_device(btrfs_dev* dev, UINT64 id, UINT64 size, BTRFS_UUID* fsuuid, UINT32 sector_size, ULONG* seed) {
|
||||
static void init_device(btrfs_dev* dev, uint64_t id, uint64_t size, BTRFS_UUID* fsuuid, uint32_t sector_size, ULONG* seed) {
|
||||
#endif
|
||||
dev->dev_item.dev_id = id;
|
||||
dev->dev_item.num_bytes = size;
|
||||
@ -765,126 +758,16 @@ static void init_device(btrfs_dev* dev, UINT64 id, UINT64 size, BTRFS_UUID* fsuu
|
||||
dev->last_alloc = 0x100000; // skip first megabyte
|
||||
}
|
||||
|
||||
#ifdef __REACTOS__
|
||||
NTSTATUS NTAPI RtlUnicodeToUTF8N(CHAR *utf8_dest, ULONG utf8_bytes_max,
|
||||
ULONG *utf8_bytes_written,
|
||||
const WCHAR *uni_src, ULONG uni_bytes)
|
||||
{
|
||||
NTSTATUS status;
|
||||
ULONG i;
|
||||
ULONG written;
|
||||
ULONG ch;
|
||||
BYTE utf8_ch[4];
|
||||
ULONG utf8_ch_len;
|
||||
|
||||
if (!uni_src)
|
||||
return STATUS_INVALID_PARAMETER_4;
|
||||
if (!utf8_bytes_written)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
if (utf8_dest && uni_bytes % sizeof(WCHAR))
|
||||
return STATUS_INVALID_PARAMETER_5;
|
||||
|
||||
written = 0;
|
||||
status = STATUS_SUCCESS;
|
||||
|
||||
for (i = 0; i < uni_bytes / sizeof(WCHAR); i++)
|
||||
{
|
||||
/* decode UTF-16 into ch */
|
||||
ch = uni_src[i];
|
||||
if (ch >= 0xdc00 && ch <= 0xdfff)
|
||||
{
|
||||
ch = 0xfffd;
|
||||
status = STATUS_SOME_NOT_MAPPED;
|
||||
}
|
||||
else if (ch >= 0xd800 && ch <= 0xdbff)
|
||||
{
|
||||
if (i + 1 < uni_bytes / sizeof(WCHAR))
|
||||
{
|
||||
ch -= 0xd800;
|
||||
ch <<= 10;
|
||||
if (uni_src[i + 1] >= 0xdc00 && uni_src[i + 1] <= 0xdfff)
|
||||
{
|
||||
ch |= uni_src[i + 1] - 0xdc00;
|
||||
ch += 0x010000;
|
||||
i++;
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = 0xfffd;
|
||||
status = STATUS_SOME_NOT_MAPPED;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ch = 0xfffd;
|
||||
status = STATUS_SOME_NOT_MAPPED;
|
||||
}
|
||||
}
|
||||
|
||||
/* encode ch as UTF-8 */
|
||||
ASSERT(ch <= 0x10ffff);
|
||||
if (ch < 0x80)
|
||||
{
|
||||
utf8_ch[0] = ch & 0x7f;
|
||||
utf8_ch_len = 1;
|
||||
}
|
||||
else if (ch < 0x800)
|
||||
{
|
||||
utf8_ch[0] = 0xc0 | (ch >> 6 & 0x1f);
|
||||
utf8_ch[1] = 0x80 | (ch >> 0 & 0x3f);
|
||||
utf8_ch_len = 2;
|
||||
}
|
||||
else if (ch < 0x10000)
|
||||
{
|
||||
utf8_ch[0] = 0xe0 | (ch >> 12 & 0x0f);
|
||||
utf8_ch[1] = 0x80 | (ch >> 6 & 0x3f);
|
||||
utf8_ch[2] = 0x80 | (ch >> 0 & 0x3f);
|
||||
utf8_ch_len = 3;
|
||||
}
|
||||
else if (ch < 0x200000)
|
||||
{
|
||||
utf8_ch[0] = 0xf0 | (ch >> 18 & 0x07);
|
||||
utf8_ch[1] = 0x80 | (ch >> 12 & 0x3f);
|
||||
utf8_ch[2] = 0x80 | (ch >> 6 & 0x3f);
|
||||
utf8_ch[3] = 0x80 | (ch >> 0 & 0x3f);
|
||||
utf8_ch_len = 4;
|
||||
}
|
||||
|
||||
if (!utf8_dest)
|
||||
{
|
||||
written += utf8_ch_len;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (utf8_bytes_max >= utf8_ch_len)
|
||||
{
|
||||
memcpy(utf8_dest, utf8_ch, utf8_ch_len);
|
||||
utf8_dest += utf8_ch_len;
|
||||
utf8_bytes_max -= utf8_ch_len;
|
||||
written += utf8_ch_len;
|
||||
}
|
||||
else
|
||||
{
|
||||
utf8_bytes_max = 0;
|
||||
status = STATUS_BUFFER_TOO_SMALL;
|
||||
}
|
||||
}
|
||||
|
||||
*utf8_bytes_written = written;
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
|
||||
static NTSTATUS write_superblocks(HANDLE h, btrfs_dev* dev, btrfs_root* chunk_root, btrfs_root* root_root, btrfs_root* extent_root,
|
||||
btrfs_chunk* sys_chunk, UINT32 node_size, BTRFS_UUID* fsuuid, UINT32 sector_size, PUNICODE_STRING label, UINT64 incompat_flags) {
|
||||
btrfs_chunk* sys_chunk, uint32_t node_size, BTRFS_UUID* fsuuid, uint32_t sector_size, PUNICODE_STRING label, uint64_t incompat_flags) {
|
||||
NTSTATUS Status;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
ULONG sblen;
|
||||
int i;
|
||||
UINT32 crc32;
|
||||
uint32_t crc32;
|
||||
superblock* sb;
|
||||
KEY* key;
|
||||
UINT64 bytes_used;
|
||||
uint64_t bytes_used;
|
||||
LIST_ENTRY* le;
|
||||
|
||||
sblen = sizeof(*sb);
|
||||
@ -932,10 +815,16 @@ static NTSTATUS write_superblocks(HANDLE h, btrfs_dev* dev, btrfs_root* chunk_ro
|
||||
memcpy(&sb->dev_item, &dev->dev_item, sizeof(DEV_ITEM));
|
||||
|
||||
if (label->Length > 0) {
|
||||
int i;
|
||||
ULONG utf8len;
|
||||
#ifdef __REACTOS__
|
||||
ANSI_STRING as;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < label->Length / sizeof(WCHAR); i++) {
|
||||
#else
|
||||
ULONG utf8len;
|
||||
|
||||
for (unsigned int i = 0; i < label->Length / sizeof(WCHAR); i++) {
|
||||
#endif
|
||||
if (label->Buffer[i] == '/' || label->Buffer[i] == '\\') {
|
||||
#ifndef __REACTOS__
|
||||
free(sb);
|
||||
@ -946,34 +835,29 @@ static NTSTATUS write_superblocks(HANDLE h, btrfs_dev* dev, btrfs_root* chunk_ro
|
||||
}
|
||||
}
|
||||
|
||||
Status = RtlUnicodeToUTF8N(NULL, 0, &utf8len, label->Buffer, label->Length);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
#ifndef __REACTOS__
|
||||
free(sb);
|
||||
#else
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, sb);
|
||||
#endif
|
||||
return Status;
|
||||
}
|
||||
utf8len = WideCharToMultiByte(CP_UTF8, 0, label->Buffer, label->Length, NULL, 0, NULL, NULL);
|
||||
|
||||
if (utf8len > MAX_LABEL_SIZE) {
|
||||
#ifndef __REACTOS__
|
||||
if (utf8len == 0 || utf8len > MAX_LABEL_SIZE) {
|
||||
free(sb);
|
||||
#else
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, sb);
|
||||
#endif
|
||||
return STATUS_INVALID_VOLUME_LABEL;
|
||||
}
|
||||
|
||||
Status = RtlUnicodeToUTF8N((PCHAR)&sb->label, MAX_LABEL_SIZE, &utf8len, label->Buffer, label->Length);
|
||||
if (!NT_SUCCESS(Status)) {
|
||||
#ifndef __REACTOS__
|
||||
if (WideCharToMultiByte(CP_UTF8, 0, label->Buffer, label->Length, sb->label, utf8len, NULL, NULL) == 0) {
|
||||
free(sb);
|
||||
#else
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, sb);
|
||||
#endif
|
||||
return Status;
|
||||
return STATUS_INVALID_VOLUME_LABEL;
|
||||
}
|
||||
#else
|
||||
as.Buffer = sb->label;
|
||||
as.Length = 0;
|
||||
as.MaximumLength = MAX_LABEL_SIZE;
|
||||
|
||||
if (!NT_SUCCESS(RtlUnicodeStringToAnsiString(&as, label, FALSE)))
|
||||
{
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, sb);
|
||||
return STATUS_INVALID_VOLUME_LABEL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
sb->cache_generation = 0xffffffffffffffff;
|
||||
|
||||
@ -992,8 +876,8 @@ static NTSTATUS write_superblocks(HANDLE h, btrfs_dev* dev, btrfs_root* chunk_ro
|
||||
|
||||
sb->sb_phys_addr = superblock_addrs[i];
|
||||
|
||||
crc32 = ~calc_crc32c(0xffffffff, (UINT8*)&sb->uuid, (ULONG)sizeof(superblock) - sizeof(sb->checksum));
|
||||
memcpy(&sb->checksum, &crc32, sizeof(UINT32));
|
||||
crc32 = ~calc_crc32c(0xffffffff, (uint8_t*)&sb->uuid, (ULONG)sizeof(superblock) - sizeof(sb->checksum));
|
||||
memcpy(&sb->checksum, &crc32, sizeof(uint32_t));
|
||||
|
||||
off.QuadPart = superblock_addrs[i];
|
||||
|
||||
@ -1045,7 +929,7 @@ GetSystemTimeAsFileTime(OUT PFILETIME lpFileTime)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void init_fs_tree(btrfs_root* r, UINT32 node_size) {
|
||||
static void init_fs_tree(btrfs_root* r, uint32_t node_size) {
|
||||
INODE_ITEM ii;
|
||||
INODE_REF* ir;
|
||||
FILETIME filetime;
|
||||
@ -1108,8 +992,7 @@ static NTSTATUS clear_first_megabyte(HANDLE h) {
|
||||
NTSTATUS Status;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
LARGE_INTEGER zero;
|
||||
UINT8* mb;
|
||||
|
||||
uint8_t* mb;
|
||||
|
||||
#ifndef __REACTOS__
|
||||
mb = malloc(0x100000);
|
||||
@ -1157,7 +1040,7 @@ static BOOL is_ssd(HANDLE h) {
|
||||
Status = NtDeviceIoControlFile(h, NULL, NULL, NULL, &iosb, IOCTL_ATA_PASS_THROUGH, apte, aptelen, apte, aptelen);
|
||||
|
||||
if (NT_SUCCESS(Status)) {
|
||||
idd = (IDENTIFY_DEVICE_DATA*)((UINT8*)apte + sizeof(ATA_PASS_THROUGH_EX));
|
||||
idd = (IDENTIFY_DEVICE_DATA*)((uint8_t*)apte + sizeof(ATA_PASS_THROUGH_EX));
|
||||
|
||||
if (idd->NominalMediaRotationRate == 1) {
|
||||
#ifndef __REACTOS__
|
||||
@ -1178,7 +1061,7 @@ static BOOL is_ssd(HANDLE h) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static NTSTATUS write_btrfs(HANDLE h, UINT64 size, PUNICODE_STRING label, UINT32 sector_size, UINT32 node_size, UINT64 incompat_flags) {
|
||||
static NTSTATUS write_btrfs(HANDLE h, uint64_t size, PUNICODE_STRING label, uint32_t sector_size, uint32_t node_size, uint64_t incompat_flags) {
|
||||
NTSTATUS Status;
|
||||
LIST_ENTRY roots, chunks;
|
||||
btrfs_root *root_root, *chunk_root, *extent_root, *dev_root, *fs_root, *reloc_root;
|
||||
@ -1186,13 +1069,13 @@ static NTSTATUS write_btrfs(HANDLE h, UINT64 size, PUNICODE_STRING label, UINT32
|
||||
btrfs_dev dev;
|
||||
BTRFS_UUID fsuuid, chunkuuid;
|
||||
BOOL ssd;
|
||||
UINT64 metadata_flags;
|
||||
uint64_t metadata_flags;
|
||||
#ifdef __REACTOS__
|
||||
ULONG seed;
|
||||
#endif
|
||||
|
||||
#ifndef __REACTOS__
|
||||
srand(time(0));
|
||||
srand((unsigned int)time(0));
|
||||
get_uuid(&fsuuid);
|
||||
get_uuid(&chunkuuid);
|
||||
#else
|
||||
@ -1264,14 +1147,14 @@ static NTSTATUS write_btrfs(HANDLE h, UINT64 size, PUNICODE_STRING label, UINT32
|
||||
}
|
||||
|
||||
static BOOL look_for_device(btrfs_filesystem* bfs, BTRFS_UUID* devuuid) {
|
||||
UINT32 i;
|
||||
uint32_t i;
|
||||
btrfs_filesystem_device* dev;
|
||||
|
||||
for (i = 0; i < bfs->num_devices; i++) {
|
||||
if (i == 0)
|
||||
dev = &bfs->device;
|
||||
else
|
||||
dev = (btrfs_filesystem_device*)((UINT8*)dev + offsetof(btrfs_filesystem_device, name[0]) + dev->name_length);
|
||||
dev = (btrfs_filesystem_device*)((uint8_t*)dev + offsetof(btrfs_filesystem_device, name[0]) + dev->name_length);
|
||||
|
||||
if (RtlCompareMemory(&dev->uuid, devuuid, sizeof(BTRFS_UUID)) == sizeof(BTRFS_UUID))
|
||||
return TRUE;
|
||||
@ -1280,14 +1163,14 @@ static BOOL look_for_device(btrfs_filesystem* bfs, BTRFS_UUID* devuuid) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static BOOL is_mounted_multi_device(HANDLE h, UINT32 sector_size) {
|
||||
static BOOL is_mounted_multi_device(HANDLE h, uint32_t sector_size) {
|
||||
NTSTATUS Status;
|
||||
superblock* sb;
|
||||
ULONG sblen;
|
||||
IO_STATUS_BLOCK iosb;
|
||||
LARGE_INTEGER off;
|
||||
BTRFS_UUID fsuuid, devuuid;
|
||||
UINT32 crc32;
|
||||
uint32_t crc32;
|
||||
UNICODE_STRING us;
|
||||
OBJECT_ATTRIBUTES atts;
|
||||
HANDLE h2;
|
||||
@ -1328,8 +1211,8 @@ static BOOL is_mounted_multi_device(HANDLE h, UINT32 sector_size) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
crc32 = ~calc_crc32c(0xffffffff, (UINT8*)&sb->uuid, (ULONG)sizeof(superblock) - sizeof(sb->checksum));
|
||||
if (crc32 != *((UINT32*)sb)) {
|
||||
crc32 = ~calc_crc32c(0xffffffff, (uint8_t*)&sb->uuid, (ULONG)sizeof(superblock) - sizeof(sb->checksum));
|
||||
if (crc32 != *((uint32_t*)sb)) {
|
||||
#ifndef __REACTOS__
|
||||
free(sb);
|
||||
#else
|
||||
@ -1347,7 +1230,7 @@ static BOOL is_mounted_multi_device(HANDLE h, UINT32 sector_size) {
|
||||
RtlFreeHeap(RtlGetProcessHeap(), 0, sb);
|
||||
#endif
|
||||
|
||||
us.Length = us.MaximumLength = wcslen(btrfs) * sizeof(WCHAR);
|
||||
us.Length = us.MaximumLength = (USHORT)(wcslen(btrfs) * sizeof(WCHAR));
|
||||
us.Buffer = btrfs;
|
||||
|
||||
InitializeObjectAttributes(&atts, &us, 0, NULL, NULL);
|
||||
@ -1395,7 +1278,7 @@ static BOOL is_mounted_multi_device(HANDLE h, UINT32 sector_size) {
|
||||
if (bfs2->next_entry == 0)
|
||||
break;
|
||||
else
|
||||
bfs2 = (btrfs_filesystem*)((UINT8*)bfs2 + bfs2->next_entry);
|
||||
bfs2 = (btrfs_filesystem*)((uint8_t*)bfs2 + bfs2->next_entry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1446,14 +1329,14 @@ NTSTATUS NTAPI BtrfsFormatEx(PUNICODE_STRING DriveRoot, FMIFS_MEDIA_FLAG MediaFl
|
||||
IO_STATUS_BLOCK iosb;
|
||||
GET_LENGTH_INFORMATION gli;
|
||||
DISK_GEOMETRY dg;
|
||||
UINT32 sector_size, node_size;
|
||||
uint32_t sector_size, node_size;
|
||||
UNICODE_STRING btrfsus;
|
||||
#ifndef __REACTOS__
|
||||
HANDLE token;
|
||||
TOKEN_PRIVILEGES tp;
|
||||
LUID luid;
|
||||
#endif
|
||||
UINT64 incompat_flags;
|
||||
uint64_t incompat_flags;
|
||||
UNICODE_STRING empty_label;
|
||||
|
||||
static WCHAR btrfs[] = L"\\Btrfs";
|
||||
@ -1561,7 +1444,7 @@ end:
|
||||
|
||||
if (NT_SUCCESS(Status)) {
|
||||
btrfsus.Buffer = btrfs;
|
||||
btrfsus.Length = btrfsus.MaximumLength = wcslen(btrfs) * sizeof(WCHAR);
|
||||
btrfsus.Length = btrfsus.MaximumLength = (USHORT)(wcslen(btrfs) * sizeof(WCHAR));
|
||||
|
||||
InitializeObjectAttributes(&attr, &btrfsus, 0, NULL, NULL);
|
||||
|
||||
@ -1604,18 +1487,18 @@ end:
|
||||
return Status;
|
||||
}
|
||||
|
||||
BOOL __stdcall FormatEx(DSTRING* root, STREAM_MESSAGE* message, options* opts, UINT32 unk1) {
|
||||
BOOL __stdcall FormatEx(DSTRING* root, STREAM_MESSAGE* message, options* opts, uint32_t unk1) {
|
||||
UNICODE_STRING DriveRoot, Label;
|
||||
NTSTATUS Status;
|
||||
|
||||
if (!root || !root->string)
|
||||
return FALSE;
|
||||
|
||||
DriveRoot.Length = DriveRoot.MaximumLength = wcslen(root->string) * sizeof(WCHAR);
|
||||
DriveRoot.Length = DriveRoot.MaximumLength = (USHORT)(wcslen(root->string) * sizeof(WCHAR));
|
||||
DriveRoot.Buffer = root->string;
|
||||
|
||||
if (opts && opts->label && opts->label->string) {
|
||||
Label.Length = Label.MaximumLength = wcslen(opts->label->string) * sizeof(WCHAR);
|
||||
Label.Length = Label.MaximumLength = (USHORT)(wcslen(opts->label->string) * sizeof(WCHAR));
|
||||
Label.Buffer = opts->label->string;
|
||||
} else {
|
||||
Label.Length = Label.MaximumLength = 0;
|
||||
@ -1639,11 +1522,11 @@ void __stdcall SetSizes(ULONG sector, ULONG node) {
|
||||
def_node_size = node;
|
||||
}
|
||||
|
||||
void __stdcall SetIncompatFlags(UINT64 incompat_flags) {
|
||||
void __stdcall SetIncompatFlags(uint64_t incompat_flags) {
|
||||
def_incompat_flags = incompat_flags;
|
||||
}
|
||||
|
||||
BOOL __stdcall GetFilesystemInformation(UINT32 unk1, UINT32 unk2, void* unk3) {
|
||||
BOOL __stdcall GetFilesystemInformation(uint32_t unk1, uint32_t unk2, void* unk3) {
|
||||
// STUB - undocumented
|
||||
|
||||
return TRUE;
|
||||
|
Loading…
Reference in New Issue
Block a user