34 ERR(
"out of memory\n");
41 ERR(
"out of memory\n");
52 t->has_address =
true;
59 t->has_new_address =
false;
60 t->updated_extents =
false;
62 t->uniqueness_determined =
false;
66 if (
t->header.level == 0) {
71 ERR(
"tree at %I64x has more items than expected (%x)\n",
addr,
t->header.num_items);
76 for (
i = 0;
i <
t->header.num_items;
i++) {
77 td = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
79 ERR(
"out of memory\n");
93 ExFreeToPagedLookasideList(&
t->Vcb->tree_data_lookaside, td);
107 t->size +=
t->header.num_items *
sizeof(
leaf_node);
114 ERR(
"tree at %I64x has more items than expected (%x)\n",
addr,
t->header.num_items);
119 for (
i = 0;
i <
t->header.num_items;
i++) {
120 td = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
122 ERR(
"out of memory\n");
148 if (!
Vcb->trees_ptrs[
h]) {
151 le =
Vcb->trees_hash.Flink;
156 if (
Vcb->trees_ptrs[h2]) {
157 le =
Vcb->trees_ptrs[h2];
165 le =
Vcb->trees_ptrs[
h];
168 while (le != &
Vcb->trees_hash) {
171 if (t2->
hash >=
t->hash) {
183 if (!
Vcb->trees_ptrs[
h] ||
t->list_entry_hash.Flink ==
Vcb->trees_ptrs[
h])
184 Vcb->trees_ptrs[
h] = &
t->list_entry_hash;
188 TRACE(
"returning %p\n",
t);
203 ERR(
"load_tree returned %08lx\n",
Status);
210 if (
t &&
t->header.level <=
nt->header.level)
int3;
229 ERR(
"out of memory\n");
236 ERR(
"read_data returned 0x%08lx\n",
Status);
253 if (!th->tree || th->tree->buf !=
buf)
257 ERR(
"do_load_tree2 returned %08lx\n",
Status);
273 if (
r &&
r->treeholder.tree !=
t)
278 t->paritem->treeholder.tree =
NULL;
287 ExFreeToPagedLookasideList(&
t->Vcb->tree_data_lookaside, td);
293 r->treeholder.tree =
NULL;
295 if (
t->list_entry_hash.Flink) {
297 if (
t->Vcb->trees_ptrs[
h] == &
t->list_entry_hash) {
298 if (
t->list_entry_hash.Flink != &
t->Vcb->trees_hash) {
301 if ((t2->
hash >> 24) ==
h)
304 t->Vcb->trees_ptrs[
h] =
NULL;
306 t->Vcb->trees_ptrs[
h] =
NULL;
325 if (le == &
t->itemlist)
335 if (le == &
t->itemlist)
345 if (le == &
t->itemlist)
367 }
while (td2 && !next_item(t2, td2));
372 td2 = next_item(t2, td2);
400 ERR(
"next_item2 returned %08lx\n",
Status);
408 ERR(
"next_item2 returned %08lx\n",
Status);
412 if (*ended1 || *ended2) {
416 ERR(
"find_item returned %08lx\n",
Status);
419 }
else if (!*ended2) {
422 ERR(
"find_item returned %08lx\n",
Status);
433 ERR(
"find_item returned %08lx\n",
Status);
439 ERR(
"find_item returned %08lx\n",
Status);
472 td = next_item(
t, td);
475 if (
t->header.level == 0 &&
cmp == 0 && !ignore && td && td->
ignore) {
479 td = next_item(
t, td);
491 }
while (td &&
cmp == 1);
493 if ((
cmp == -1 || !td) && lasttd)
496 if (
t->header.level == 0) {
497 if (td->
ignore && !ignore) {
533 td = prev_item(
t, td);
539 if (
t->header.level <=
level) {
548 ERR(
"do_load_tree returned %08lx\n",
Status);
564 if (!
r->treeholder.tree) {
567 ERR(
"do_load_tree returned %08lx\n",
Status);
572 Status = find_item_in_tree(
Vcb,
r->treeholder.tree,
tp, searchkey, ignore, 0,
Irp);
574 ERR(
"find_item_in_tree returned %08lx\n",
Status);
584 if (!
r->treeholder.tree) {
587 ERR(
"do_load_tree returned %08lx\n",
Status);
594 ERR(
"find_item_in_tree returned %08lx\n",
Status);
620 next_tp->item =
next;
623 if (!ignore && next_tp->item->ignore) {
624 ERR(
"error - returning ignored item\n");
638 td = next_item(
t->parent,
t->paritem);
652 ERR(
"do_load_tree returned %08lx\n",
Status);
659 while (
t->header.level != 0) {
670 ERR(
"do_load_tree returned %08lx\n",
Status);
679 next_tp->item = first_item(
t);
684 if (!ignore && next_tp->item->ignore) {
691 if (!next_tp->item->ignore)
700 if (!ignore && next_tp->item->ignore) {
701 ERR(
"error - returning ignored item\n");
713 if (le == &
t->itemlist)
737 while (
t && (!
t->parent || !prev_item(
t->parent,
t->paritem))) {
744 td = prev_item(
t->parent,
t->paritem);
749 ERR(
"do_load_tree returned %08lx\n",
Status);
756 while (
t->header.level != 0) {
761 if (!
li->treeholder.tree) {
764 ERR(
"do_load_tree returned %08lx\n",
Status);
769 t =
li->treeholder.tree;
773 prev_tp->item = last_item(
t);
786 le =
Vcb->trees.Flink;
788 while (le != &
Vcb->trees) {
793 if (
t->header.level ==
level) {
794 bool top = !
t->paritem;
799 if (
top &&
r->treeholder.tree ==
t)
800 r->treeholder.tree =
NULL;
804 }
else if (
t->header.level >
level)
824 le =
Vcb->trees.Flink;
826 while (le != &
Vcb->trees) {
831 if (
t->header.level ==
level) {
832 bool top = !
t->paritem;
837 if (
top &&
r->treeholder.tree ==
t)
838 r->treeholder.tree =
NULL;
842 }
else if (
t->header.level >
level)
858#pragma warning(suppress: 28194)
866 ERR(
"out of memory\n");
880#pragma warning(suppress: 28194)
893 KEY firstitem = {0xcccccccccccccccc,0xcc,0xcccccccccccccccc};
897 TRACE(
"(%p, %p, %I64x, %x, %I64x, %p, %x, %p)\n",
Vcb,
r, obj_id, obj_type,
offset,
data,
size, ptp);
899 searchkey.
obj_id = obj_id;
905 if (!
r->treeholder.tree) {
908 ERR(
"do_load_tree returned %08lx\n",
Status);
913 if (
r->treeholder.tree &&
r->treeholder.tree->header.num_items == 0) {
917 ERR(
"error: unable to load tree for root %I64x\n",
r->id);
921 ERR(
"find_item returned %08lx\n",
Status);
932 ERR(
"error: key (%I64x,%x,%I64x) already present\n", obj_id, obj_type,
offset);
941 td = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
943 ERR(
"out of memory\n");
957 firstitem = td2->
key;
961 TRACE(
"inserting %I64x,%x,%I64x into tree beginning %I64x,%x,%I64x (num_items %x)\n", obj_id, obj_type,
offset, firstitem.
obj_id, firstitem.
obj_type, firstitem.
offset,
tp.
tree->
header.
num_items);
970 paritem->
key = searchkey;
986 Vcb->need_write =
true;
994 if (
t->paritem &&
t->paritem->ignore) {
996 t->parent->header.num_items++;
1000 t->header.generation =
Vcb->superblock.generation;
1017#ifdef DEBUG_PARANOID
1029 Vcb->need_write =
true;
1039 gen =
tp->
tree->
Vcb->superblock.generation;
1102 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
1140 ERR(
"update_changed_extent_ref returned %08lx\n",
Status);
1228 tree_end->obj_id = 0xffffffffffffffff;
1229 tree_end->obj_type = 0xff;
1230 tree_end->offset = 0xffffffffffffffff;
1237 if (
pi->list_entry.Flink != &
p->parent->itemlist) {
1240 *tree_end = td->
key;
1263 ExFreeToPagedLookasideList(&
Vcb->batch_item_lookaside, bi);
1280 TRACE(
"entry in INODE_REF not found, adding Batch_DeleteInodeExtRef entry\n");
1282 bi2 = ExAllocateFromPagedLookasideList(&
Vcb->batch_item_lookaside);
1284 ERR(
"out of memory\n");
1290 ERR(
"out of memory\n");
1295 ier->dir = bi->key.offset;
1296 ier->index = delir->
index;
1307 le = bi->list_entry.Flink;
1308 while (le != listhead) {
1329 switch (bi->operation) {
1332 ERR(
"(%I64x,%x,%I64x) was %u bytes, expected at least %Iu\n", bi->key.obj_id, bi->key.obj_type, bi->key.offset, td->size,
sizeof(
DIR_ITEM));
1343 ERR(
"(%I64x,%x,%I64x) was truncated\n", bi->key.obj_id, bi->key.obj_type, bi->key.offset);
1347 oldxasize =
sizeof(
DIR_ITEM) - 1 + xa->m + xa->n;
1354 if (td->size + bi->datalen - oldxasize > maxlen)
1355 ERR(
"DIR_ITEM would be over maximum size, truncating (%u + %u - %lu > %u)\n", td->size, bi->datalen, oldxasize, maxlen);
1359 ERR(
"out of memory\n");
1375 bi->datalen = (
uint16_t)
min(td->size + bi->datalen - oldxasize, maxlen);
1386 if (td->size + bi->datalen > maxlen)
1387 ERR(
"DIR_ITEM would be over maximum size, truncating (%u + %u > %u)\n", td->size, bi->datalen, maxlen);
1391 ERR(
"out of memory\n");
1400 bi->datalen =
min(bi->datalen + td->size, maxlen);
1407 xa = (
DIR_ITEM*)&xa->name[xa->m + xa->n];
1418 if (td->size + bi->datalen > maxlen) {
1419 ERR(
"DIR_ITEM would be over maximum size (%u + %u > %u)\n", td->size, bi->datalen, maxlen);
1425 ERR(
"out of memory\n");
1433 bi->datalen += td->size;
1444 if (td->size + bi->datalen > maxlen) {
1451 bool inserted =
false;
1453 TRACE(
"INODE_REF would be too long, adding INODE_EXTREF instead\n");
1459 ERR(
"out of memory\n");
1463 ier->dir = bi->key.offset;
1464 ier->index = ir->
index;
1468 bi2 = ExAllocateFromPagedLookasideList(&
Vcb->batch_item_lookaside);
1470 ERR(
"out of memory\n");
1482 le = bi->list_entry.
Flink;
1483 while (le != listhead) {
1500 ERR(
"INODE_REF would be over maximum size (%u + %u > %u)\n", td->size, bi->datalen, maxlen);
1507 ERR(
"out of memory\n");
1515 bi->datalen += td->size;
1526 if (td->size + bi->datalen > maxlen) {
1527 ERR(
"INODE_EXTREF would be over maximum size (%u + %u > %u)\n", td->size, bi->datalen, maxlen);
1533 ERR(
"out of memory\n");
1541 bi->datalen += td->size;
1551 ERR(
"DIR_ITEM was %u bytes, expected at least %Iu\n", td->size,
sizeof(
DIR_ITEM));
1566 TRACE(
"deleting DIR_ITEM\n");
1572 ERR(
"out of memory\n");
1576 TRACE(
"modifying DIR_ITEM\n");
1578 if ((
uint8_t*)di > td->data) {
1580 dioff = newdi + ((
uint8_t*)di - td->data);
1585 if ((
uint8_t*)&di->
name[di->
n + di->
m] < td->data + td->size)
1588 td2 = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
1590 ERR(
"out of memory\n");
1603 t->header.num_items++;
1615 TRACE(
"could not find DIR_ITEM to delete\n");
1626 ERR(
"INODE_REF was %u bytes, expected at least %Iu\n", td->size,
sizeof(
INODE_REF));
1631 bool changed =
false;
1641 ERR(
"INODE_REF was truncated\n");
1648 uint16_t newlen = td->size - itemlen;
1653 TRACE(
"deleting INODE_REF\n");
1659 ERR(
"out of memory\n");
1663 TRACE(
"modifying INODE_REF\n");
1665 if ((
uint8_t*)ir > td->data) {
1667 iroff = newir + ((
uint8_t*)ir - td->data);
1675 td2 = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
1677 ERR(
"out of memory\n");
1690 t->header.num_items++;
1698 if (
len > itemlen) {
1707 TRACE(
"entry in INODE_REF not found, adding Batch_DeleteInodeExtRef entry\n");
1709 add_delete_inode_extref(
Vcb, bi, listhead);
1714 WARN(
"entry not found in INODE_REF\n");
1723 ERR(
"INODE_EXTREF was %u bytes, expected at least %Iu\n", td->size,
sizeof(
INODE_EXTREF));
1737 ERR(
"INODE_REF was truncated\n");
1744 uint16_t newlen = td->size - itemlen;
1747 TRACE(
"deleting INODE_EXTREF\n");
1753 ERR(
"out of memory\n");
1757 TRACE(
"modifying INODE_EXTREF\n");
1759 if ((
uint8_t*)ier > td->data) {
1761 ieroff = newier + ((
uint8_t*)ier - td->data);
1766 if ((
uint8_t*)&ier->
name[ier->
n] < td->data + td->size)
1769 td2 = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
1771 ERR(
"out of memory\n");
1784 t->header.num_items++;
1792 if (
len > itemlen) {
1804 ERR(
"XATTR_ITEM was %u bytes, expected at least %Iu\n", td->size,
sizeof(
DIR_ITEM));
1819 TRACE(
"deleting XATTR_ITEM\n");
1825 ERR(
"out of memory\n");
1829 TRACE(
"modifying XATTR_ITEM\n");
1831 if ((
uint8_t*)di > td->data) {
1833 dioff = newdi + ((
uint8_t*)di - td->data);
1837 if ((
uint8_t*)&di->
name[di->
n + di->
m] < td->data + td->size)
1840 td2 = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
1842 ERR(
"out of memory\n");
1855 t->header.num_items++;
1867 TRACE(
"could not find DIR_ITEM to delete\n");
1880 ERR(
"unexpected batch operation type\n");
1888 t->header.num_items--;
1894 newtd->data = bi->data;
1895 newtd->size = bi->datalen;
1899 ERR(
"(%I64x,%x,%I64x) already exists\n", bi->key.obj_id, bi->key.obj_type, bi->key.offset);
1913 TRACE(
"root: %I64x\n", br->r->id);
1931 while (le != &
items) {
1940 bool ignore =
false;
1946 ERR(
"find_item returned %08lx\n",
Status);
1952 ERR(
"find_tree_end returned %08lx\n",
Status);
2027 ERR(
"find_tree_end returned %08lx\n",
Status);
2162 td = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
2164 ERR(
"out of memory\n");
2193 }
else if (
cmp == 0) {
2200 ERR(
"handle_batch_collision returned %08lx\n",
Status);
2206 ExFreeToPagedLookasideList(&
Vcb->tree_data_lookaside, td);
2216 add_delete_inode_extref(
Vcb, bi, &
items);
2219 if (!ignore && td) {
2238 while (le2 != &
items) {
2244 if (no_end ||
keycmp(bi2->
key, tree_end) == -1) {
2246 bool inserted =
false;
2254 td = ExAllocateFromPagedLookasideList(&
Vcb->tree_data_lookaside);
2256 ERR(
"out of memory\n");
2279 add_delete_inode_extref(
Vcb, bi2, &
items);
2284 ERR(
"handle_batch_collision returned %08lx\n",
Status);
2294 }
else if (
cmp == -1) {
2299 add_delete_inode_extref(
Vcb, bi2, &
items);
2318 add_delete_inode_extref(
Vcb, bi2, &
items);
2339 if (
t->paritem &&
t->paritem->ignore) {
2341 t->parent->header.num_items++;
2345 t->header.generation =
Vcb->superblock.generation;
2361 ExFreeToPagedLookasideList(&
Vcb->batch_item_lookaside, bi);
2377 ERR(
"commit_batch_list_root returned %08lx\n",
Status);
unsigned short int uint16_t
void void void NTSTATUS void NTSTATUS skip_to_difference(device_extension *Vcb, traverse_ptr *tp, traverse_ptr *tp2, bool *ended1, bool *ended2) __attribute__((nonnull(1
#define acquire_chunk_lock(c, Vcb)
@ Batch_DeleteInodeExtRef
_In_ fcb _In_ chunk _In_ uint64_t _In_ uint64_t _In_ bool _In_opt_ void _In_opt_ PIRP _In_ LIST_ENTRY * rollback
#define keycmp(key1, key2)
void void free_trees_root(device_extension *Vcb, root *r) __attribute__((nonnull(1
void void void add_rollback(_In_ LIST_ENTRY *rollback, _In_ enum rollback_type type, _In_ __drv_aliasesMem void *ptr) __attribute__((nonnull(1
void space_list_add2(LIST_ENTRY *list, LIST_ENTRY *list_size, uint64_t address, uint64_t length, chunk *c, LIST_ENTRY *rollback)
void void void NTSTATUS commit_batch_list(_Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, LIST_ENTRY *batchlist, PIRP Irp) __attribute__((nonnull(1
void space_list_subtract2(LIST_ENTRY *list, LIST_ENTRY *list_size, uint64_t address, uint64_t length, chunk *c, LIST_ENTRY *rollback)
NTSTATUS NTSTATUS void free_tree(tree *t) __attribute__((nonnull(1)))
NTSTATUS NTSTATUS NTSTATUS NTSTATUS NTSTATUS chunk * get_chunk_from_address(device_extension *Vcb, uint64_t address) __attribute__((nonnull(1)))
void do_rollback(device_extension *Vcb, LIST_ENTRY *rollback) __attribute__((nonnull(1
NTSTATUS load_tree(device_extension *Vcb, uint64_t addr, uint8_t *buf, root *r, tree **pt) __attribute__((nonnull(1
void void void NTSTATUS void clear_batch_list(device_extension *Vcb, LIST_ENTRY *batchlist) __attribute__((nonnull(1
@ ROLLBACK_SUBTRACT_SPACE
NTSTATUS NTSTATUS bool bool find_prev_item(_Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, const traverse_ptr *tp, traverse_ptr *prev_tp, PIRP Irp) __attribute__((nonnull(1
NTSTATUS NTSTATUS do_load_tree(device_extension *Vcb, tree_holder *th, root *r, tree *t, tree_data *td, PIRP Irp) __attribute__((nonnull(1
NTSTATUS NTSTATUS bool bool void free_trees(device_extension *Vcb) __attribute__((nonnull(1)))
NTSTATUS insert_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _In_ root *r, _In_ uint64_t obj_id, _In_ uint8_t obj_type, _In_ uint64_t offset, _In_reads_bytes_opt_(size) _When_(return >=0, __drv_aliasesMem) void *data, _In_ uint16_t size, _Out_opt_ traverse_ptr *ptp, _In_opt_ PIRP Irp) __attribute__((nonnull(1
NTSTATUS NTSTATUS void clear_rollback(LIST_ENTRY *rollback) __attribute__((nonnull(1)))
NTSTATUS update_changed_extent_ref(device_extension *Vcb, chunk *c, uint64_t address, uint64_t size, uint64_t root, uint64_t objid, uint64_t offset, int32_t count, bool no_csum, bool superseded, PIRP Irp)
NTSTATUS NTSTATUS bool find_next_item(_Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, const traverse_ptr *tp, traverse_ptr *next_tp, bool ignore, PIRP Irp) __attribute__((nonnull(1
#define release_chunk_lock(c, Vcb)
NTSTATUS NTSTATUS delete_tree_item(_In_ _Requires_exclusive_lock_held_(_Curr_->tree_lock) device_extension *Vcb, _Inout_ traverse_ptr *tp) __attribute__((nonnull(1
NTSTATUS NTSTATUS find_item_to_level(device_extension *Vcb, root *r, traverse_ptr *tp, const KEY *searchkey, bool ignore, uint8_t level, PIRP Irp) __attribute__((nonnull(1
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
#define _Requires_lock_held_(lock)
#define _Requires_exclusive_lock_held_(lock)
#define NT_SUCCESS(StatCode)
static const WCHAR empty[]
static LONG find_item(PropertyBag *This, LPCOLESTR name)
void reap_filerefs(device_extension *Vcb, file_ref *fr)
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
void reap_fcbs(device_extension *Vcb)
#define TYPE_INODE_EXTREF
#define EXTENT_TYPE_PREALLOC
#define EXTENT_TYPE_INLINE
#define EXTENT_TYPE_REGULAR
#define BTRFS_INCOMPAT_FLAGS_EXTENDED_IREF
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define InsertHeadList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define RtlCompareMemory(s1, s2, l)
#define RemoveTailList(ListHead)
#define ExAcquireResourceExclusiveLite(res, wait)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
GLuint GLuint GLsizei GLenum type
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLdouble GLdouble GLdouble r
GLdouble GLdouble GLdouble GLdouble top
GLboolean GLboolean GLboolean b
GLenum GLuint GLenum GLsizei const GLchar * buf
GLenum const GLvoid * addr
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
#define cmp(status, error)
#define _When_(expr, annos)
#define _In_reads_bytes_opt_(size)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
#define STATUS_INTERNAL_ERROR
#define BTRFS_INODE_NODATASUM
static unsigned __int64 next
#define offsetof(TYPE, MEMBER)
struct _LIST_ENTRY * Blink
struct _LIST_ENTRY * Flink
struct _device_extension * Vcb
LIST_ENTRY list_entry_hash
enum batch_operation operation
#define RtlCopyMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INSUFFICIENT_RESOURCES
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)