17 #pragma warning(disable : 4716) 27 #pragma alloc_text(PAGE, RfsdLoadSuper) 28 #pragma alloc_text(PAGE, RfsdSaveSuper) 30 #pragma alloc_text(PAGE, RfsdLoadGroup) 31 #pragma alloc_text(PAGE, RfsdSaveGroup) 33 #pragma alloc_text(PAGE, RfsdLoadInode) 34 #pragma alloc_text(PAGE, RfsdSaveInode) 36 #pragma alloc_text(PAGE, RfsdLoadBlock) 37 #pragma alloc_text(PAGE, RfsdSaveBlock) 39 #pragma alloc_text(PAGE, RfsdSaveBuffer) 41 #pragma alloc_text(PAGE, RfsdGetBlock) 42 #pragma alloc_text(PAGE, RfsdBlockMap) 44 #pragma alloc_text(PAGE, RfsdBuildBDL) 45 #pragma alloc_text(PAGE, RfsdBuildBDL2) 47 #pragma alloc_text(PAGE, RfsdNewBlock) 48 #pragma alloc_text(PAGE, RfsdFreeBlock) 50 #pragma alloc_text(PAGE, RfsdExpandBlock) 51 #pragma alloc_text(PAGE, RfsdExpandInode) 53 #pragma alloc_text(PAGE, RfsdNewInode) 54 #pragma alloc_text(PAGE, RfsdFreeInode) 56 #pragma alloc_text(PAGE, RfsdAddEntry) 57 #pragma alloc_text(PAGE, RfsdRemoveEntry) 59 #pragma alloc_text(PAGE, RfsdTruncateBlock) 60 #pragma alloc_text(PAGE, RfsdTruncateInode) 62 #pragma alloc_text(PAGE, RfsdAddMcbEntry) 63 #pragma alloc_text(PAGE, RfsdRemoveMcbEntry) 64 #pragma alloc_text(PAGE, RfsdLookupMcbEntry) 66 #pragma alloc_text(PAGE, SuperblockContainsMagicKey) 67 #pragma alloc_text(PAGE, DetermineOnDiskKeyFormat) 68 #pragma alloc_text(PAGE, FillInMemoryKey) 69 #pragma alloc_text(PAGE, CompareShortKeys) 70 #pragma alloc_text(PAGE, CompareKeysWithoutOffset) 71 #pragma alloc_text(PAGE, CompareKeys) 72 #pragma alloc_text(PAGE, NavigateToLeafNode) 73 #pragma alloc_text(PAGE, _NavigateToLeafNode) 74 #pragma alloc_text(PAGE, RfsdParseFilesystemTree) 150 sb =
Vcb->SuperBlock;
156 Vcb->NumOfGroups = (
sb->s_blocks_count -
sb->s_first_data_block +
157 sb->s_blocks_per_group - 1) /
sb->s_blocks_per_group;
159 Size =
sizeof(RFSD_GROUP_DESC) *
Vcb->NumOfGroups;
210 Vcb->GroupDesc = (PRFSD_GROUP_DESC)
Buffer;
238 sizeof(
struct rfsd_group_desc),
276 &(pItemHeader), &(pItemBuffer), &(pBlockBuffer),
NULL,
307 RfsdInode->i_mtime = RfsdInode->i_atime =
311 Inode, RfsdInode->i_mode, RfsdInode->i_size));
461 }
else if (
Layer <= 3) {
485 #if DISABLED // WRITE MODE ONLY 587 dwSizes[
i] =
Vcb->dwData[
i];
598 dwBlk = Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)];
600 #if DISABLED // WRITE MODE ONLY 625 Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)] = dwBlk;
692 ULONG idxCurrentBD = 0;
700 KdPrint((
"## Allocating %i BD's\n", pInode->i_size /
Vcb->BlockSize + 3));
713 CurrentTargetKey.
k_offset = CurrentOffset + 1;
718 Vcb, &CurrentTargetKey,
719 &(pItemHeader), &(pItemBuffer), &(pBlockBuffer),
NULL,
732 for (idxBlockRef = 0; idxBlockRef < countBlockRefs; idxBlockRef++)
738 pBdl[idxCurrentBD].
Length =
Vcb->BlockSize;
739 pBdl[idxCurrentBD].
Offset = CurrentOffset;
743 if (idxBlockRef == (countBlockRefs - 1))
747 CurrentOffset +=
Vcb->BlockSize;
751 if (countBlockRefs <= 0) { done =
TRUE; }
754 if (pBlockBuffer) {
ExFreePool(pBlockBuffer); pBlockBuffer =
NULL; }
758 if (pBlockBuffer) {
ExFreePool(pBlockBuffer); pBlockBuffer =
NULL; }
762 ULONG BlockNumber = 0;
765 CurrentTargetKey.
k_offset = CurrentOffset + 1;
770 Vcb, &CurrentTargetKey,
771 &(pItemHeader), &(pItemBuffer), &(pBlockBuffer), &(BlockNumber),
780 pBdl[idxCurrentBD].
Offset = CurrentOffset;
789 else {
goto errorout; }
793 if (pBlockBuffer) {
ExFreePool(pBlockBuffer); pBlockBuffer =
NULL; }
797 ULONG BlockNumber = 0;
800 CurrentTargetKey.
k_offset = CurrentOffset + 1;
805 Vcb, &CurrentTargetKey,
806 &(pItemHeader), &(pItemBuffer), &(pBlockBuffer), &(BlockNumber),
815 pBdl[idxCurrentBD].
Offset = CurrentOffset;
822 else {
goto errorout; }
827 if (pBlockBuffer) {
ExFreePool(pBlockBuffer); pBlockBuffer =
NULL; }
830 *out_Count = idxCurrentBD;
858 if (GroupHint >
Vcb->NumOfGroups)
859 GroupHint =
Vcb->NumOfGroups - 1;
861 if (BlockHint != 0) {
869 if (
Vcb->GroupDesc[GroupHint].bg_free_blocks_count) {
873 Vcb->GroupDesc[GroupHint].bg_block_bitmap;
875 if (GroupHint ==
Vcb->NumOfGroups - 1) {
911 if (dwBlk == 0xFFFFFFFF) {
921 if (dwBlk == 0xFFFFFFFF) {
924 if (
Vcb->GroupDesc[
Group].bg_free_blocks_count) {
925 if (
Group == GroupHint)
931 if (
Vcb->NumOfGroups == 1) {
934 if (
Group ==
Vcb->NumOfGroups - 1) {
963 if (dwBlk != 0xFFFFFFFF) {
992 Vcb->GroupDesc[
Group].bg_free_blocks_count--;
995 Vcb->SuperBlock->s_free_blocks_count--;
1000 for (
i=0;
i <
Vcb->NumOfGroups;
i++)
1002 if ((
Vcb->GroupDesc[
i].bg_block_bitmap == *dwRet) ||
1003 (
Vcb->GroupDesc[
i].bg_inode_bitmap == *dwRet) ||
1004 (
Vcb->GroupDesc[
i].bg_inode_table == *dwRet) ) {
1111 Vcb->GroupDesc[
Group].bg_free_blocks_count++;
1114 Vcb->SuperBlock->s_free_blocks_count++;
1140 ULONG dwNewBlk = 0, dwBlk = 0;
1193 dwNewBlk = dwContent;
1195 }
else if (
layer <= 3) {
1281 ULONG dwBlk = 0, dwNewBlk = 0;
1291 dwSizes[
i] =
Vcb->dwData[
i];
1292 dwTotal += dwSizes[
i];
1295 if (
Index >= dwTotal) {
1303 if (
Index < dwSizes[
i]) {
1305 dwBlk = Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)];
1321 Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)] = dwBlk;
1350 Fcb->BlkHint = dwNewBlk+1;
1353 RfsdPrint((
DBG_INFO,
"RfsdExpandInode: %S (%xh) i=%2.2xh Index=%8.8xh New Block=%8.8xh\n",
1387 *Inode = dwInode = 0XFFFFFFFF;
1393 if (
Type == RFSD_FT_DIR) {
1395 Average =
Vcb->SuperBlock->s_free_inodes_count /
Vcb->NumOfGroups;
1397 for (
j = 0;
j <
Vcb->NumOfGroups;
j++) {
1399 i = (
j + GroupHint) % (
Vcb->NumOfGroups);
1401 if ((
Vcb->GroupDesc[
i].bg_used_dirs_count << 8) <
1402 Vcb->GroupDesc[
i].bg_free_inodes_count ) {
1410 for (
j = 0;
j <
Vcb->NumOfGroups;
j++) {
1412 if (
Vcb->GroupDesc[
j].bg_free_inodes_count >= Average) {
1413 if (!
Group || (
Vcb->GroupDesc[
j].bg_free_blocks_count >
1414 Vcb->GroupDesc[
Group].bg_free_blocks_count ))
1426 if (
Vcb->GroupDesc[GroupHint].bg_free_inodes_count) {
1428 Group = GroupHint + 1;
1439 for (
j = 1;
j <
Vcb->NumOfGroups;
j <<= 1) {
1442 if (
i >
Vcb->NumOfGroups)
1443 i -=
Vcb->NumOfGroups;
1445 if (
Vcb->GroupDesc[
i].bg_free_inodes_count) {
1457 for (
j = 2;
j <
Vcb->NumOfGroups;
j++) {
1458 if (++
i >=
Vcb->NumOfGroups)
i = 0;
1460 if (
Vcb->GroupDesc[
i].bg_free_inodes_count) {
1480 if (
Vcb->NumOfGroups == 1) {
1483 if (
Group ==
Vcb->NumOfGroups - 1) {
1512 if (dwInode == 0xFFFFFFFF) {
1521 if (dwInode == 0xFFFFFFFF || dwInode >=
Length) {
1523 if (
Vcb->GroupDesc[
Group].bg_free_inodes_count != 0) {
1525 Vcb->GroupDesc[
Group].bg_free_inodes_count = 0;
1547 Vcb->GroupDesc[
Group].bg_free_inodes_count--;
1548 if (
Type == RFSD_FT_DIR) {
1549 Vcb->GroupDesc[
Group].bg_used_dirs_count++;
1554 Vcb->SuperBlock->s_free_inodes_count--;
1591 Inode,
Group, dwIno));
1649 if (
Type == RFSD_FT_DIR) {
1650 Vcb->GroupDesc[
Group].bg_used_dirs_count--;
1653 Vcb->GroupDesc[
Group].bg_free_inodes_count++;
1656 Vcb->SuperBlock->s_free_inodes_count++;
1680 PRFSD_DIR_ENTRY2 pDir =
NULL;
1681 PRFSD_DIR_ENTRY2 pNewDir =
NULL;
1703 Dcb->ReferenceCount++;
1720 #if DISABLED // disabled in FFS too 1722 RFSD_FEATURE_INCOMPAT_FILETYPE)) {
1727 pDir->file_type = 0;
1745 pDir->inode = Inode;
1746 pDir->rec_len = (
USHORT) (RFSD_DIR_REC_LEN(pDir->name_len));
1752 while ((
LONGLONG)dwBytes <
Dcb->Header.AllocationSize.QuadPart) {
1760 Dcb->RfsdMcb->Inode,
1772 if (((
pTarget->inode == 0) &&
pTarget->rec_len >= pDir->rec_len) ||
1773 (
pTarget->rec_len >= RFSD_DIR_REC_LEN(
pTarget->name_len) + pDir->rec_len)) {
1783 Dcb->RfsdMcb->Inode,
1799 pNewDir->rec_len =
pTarget->rec_len - RFSD_DIR_REC_LEN(
pTarget->name_len);
1809 pNewDir->file_type = pDir->file_type;
1810 pNewDir->inode = pDir->inode;
1811 pNewDir->name_len = pDir->name_len;
1812 memcpy(pNewDir->name, pDir->name, pDir->name_len);
1813 Length += RFSD_DIR_REC_LEN(pDir->name_len);
1828 if(((pDir->name_len == 1) && (pDir->name[0] ==
'.')) ||
1829 ((pDir->name_len == 2) && (pDir->name[0] ==
'.') && (pDir->name[1] ==
'.')) ) {
1831 Dcb->Inode->i_links_count++;
1838 Dcb->RfsdMcb->Inode,
1856 Dcb->Inode->i_size =
Dcb->Header.AllocationSize.LowPart;
1860 Dcb->Header.FileSize =
Dcb->Header.AllocationSize;
1876 Dcb->ReferenceCount--;
1878 if(MainResourceAcquired) {
1910 PRFSD_DIR_ENTRY2 pPrevDir =
NULL;
1925 MainResourceAcquired =
1930 Dcb->ReferenceCount++;
1949 while ((
LONGLONG)dwBytes <
Dcb->Header.AllocationSize.QuadPart) {
1956 Dcb->RfsdMcb->Inode,
1973 if (
pTarget->inode == Inode) {
1983 dwRet = (dwBytes - PrevRecLen) & (~(
BLOCK_SIZE - 1));
1984 if (dwRet != (dwBytes & (~(
BLOCK_SIZE - 1))))
1992 pPrevDir->rec_len +=
pTarget->rec_len;
1994 RecLen = RFSD_DIR_REC_LEN(
pTarget->name_len);
2001 Dcb->RfsdMcb->Inode,
2003 dwBytes - PrevRecLen,
2015 Dcb->RfsdMcb->Inode,
2038 Dcb->RfsdMcb->Inode,
2057 Dcb->RfsdMcb->Inode,
2081 Dcb->Inode->i_links_count--;
2092 Dcb->RfsdMcb->Inode,
2103 PrevRecLen =
pTarget->rec_len;
2111 Dcb->ReferenceCount--;
2113 if(MainResourceAcquired)
2122 if (pPrevDir !=
NULL) {
2143 PRFSD_DIR_ENTRY2 pSelf =
NULL;
2156 MainResourceAcquired =
2161 Dcb->ReferenceCount++;
2179 Dcb->RfsdMcb->Inode,
2183 RFSD_DIR_REC_LEN(1) + RFSD_DIR_REC_LEN(2),
2191 ASSERT(dwBytes == RFSD_DIR_REC_LEN(1) + RFSD_DIR_REC_LEN(2));
2193 pParent = (PRFSD_DIR_ENTRY2)((
PUCHAR)pSelf + pSelf->rec_len);
2195 if (
pParent->inode != OldParent) {
2204 Dcb->RfsdMcb->Inode,
2214 Dcb->ReferenceCount--;
2216 if(MainResourceAcquired) {
2273 }
else if (dwContent == 0) {
2280 }
else if (
layer <= 3) {
2325 if (
i == 0 &&
j == 0) {
2390 dwSizes[
i] =
Vcb->dwData[
i];
2391 dwTotal += dwSizes[
i];
2394 if (
Index >= dwTotal) {
2401 if (
Index < dwSizes[
i]) {
2403 dwBlk = Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)];
2415 Inode->i_block[
i==0 ? (
Index):(
i + RFSD_NDIR_BLOCKS - 1)] = 0;
2467 &(
Vcb->McbResource),
2483 if (bRet && DirtyLba ==
Offset && DirtyLen >=
Length) {
2519 if ((!bFound) || (DirtyLba == -1) ||
2545 &(
Vcb->McbResource),
2581 &(
Vcb->McbResource),
2607 if (bFound &&( DirtyLba != -1)) {
2614 &(
Vcb->McbResource),
2644 &(
Vcb->McbResource),
2657 &(
Vcb->McbResource),
2662 if (pLba && ((*pLba) != -1)) {
2676 if (RunStart && (*RunStart != -1)) {
2677 (*RunStart) = (((*RunStart) - 1) <<
BLOCK_BITS);
2700 #define MAGIC_KEY_LENGTH 9 2714 currentChar =
sb->s_magic[
i];
2715 if (currentChar != sz_MagicKey[
i])
2760 switch (k_uniqueness)
2785 if (!pKeyOnDisk || !pKeyInMemory) {
DbgBreak();
return; }
2788 pKeyInMemory->k_dir_id = pKeyOnDisk->k_dir_id;
2789 pKeyInMemory->k_objectid = pKeyOnDisk->k_objectid;
2798 pKeyInMemory->k_offset = pKeyOnDisk->u.k_offset_v1.k_offset;
2803 pKeyInMemory->k_offset = pKeyOnDisk->u.k_offset_v2.k_offset;
2804 pKeyInMemory->k_type = (
__u32) pKeyOnDisk->u.k_offset_v2.k_type;
2948 ULONG leafNodeBlockNumber;
2969 *out_NextBlockNumber = StartingBlockNumber;
2972 if (fpDirectoryCallback)
return (*fpDirectoryCallback)(StartingBlockNumber, pContext);
2978 ULONG idxRightKey = 0;
2988 for (idxRightKey = 0; idxRightKey <= pBlockHeader->
blk_nr_item; idxRightKey++)
2991 pLeftKeyOnDisk = pRightKeyOnDisk;
2992 pRightKeyOnDisk = (idxRightKey == pBlockHeader->
blk_nr_item) ?
2996 LeftKeyInMemory = RightKeyInMemory;
2997 if (pRightKeyOnDisk)
3004 rightComparison = pRightKeyOnDisk ? ((*fpComparisonFunction)(
Key, &RightKeyInMemory)) :
RFSD_KEY_SMALLER;
3011 leftComparison = pLeftKeyOnDisk ? ((*fpComparisonFunction)(
Key, &LeftKeyInMemory)) :
RFSD_KEY_LARGER;
3022 &(leafNodeBlockNumber),
3023 ReturnOnFirstMatch, fpComparisonFunction, fpDirectoryCallback, pContext);
3027 {
goto return_results; }
3036 *out_NextBlockNumber = leafNodeBlockNumber;
#define KeQuerySystemTime(t)
#define RFSD_KEY_TYPE_v1_DIRENTRY
#define ExGetCurrentResourceThread()
struct _RFSD_SUPER_BLOCK * PRFSD_SUPER_BLOCK
NTSTATUS RfsdUnicodeToOEM(IN OUT POEM_STRING Oem, IN PUNICODE_STRING Unicode)
NTSTATUS RfsdFreeBlock(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, ULONG Block)
NTSTATUS RfsdAddEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG FileType, IN ULONG Inode, IN PUNICODE_STRING FileName)
struct reiserfs_key RFSD_KEY_ON_DISK
#define REISER2FS_SUPER_MAGIC_STRING
NTSTATUS RfsdReadDisk(IN PRFSD_VCB Vcb, IN ULONGLONG Offset, IN ULONG Size, IN PVOID Buffer, IN BOOLEAN bVerify)
#define STATUS_INSUFFICIENT_RESOURCES
_In_ ULONG _In_ ULONG _In_ ULONG Length
IN PVCB IN VBO IN ULONG OUT PBCB * Bcb
#define STATUS_NO_SUCH_MEMBER
FSRTL_ADVANCED_FCB_HEADER Header
NTSTATUS RfsdSetParentEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG OldParent, IN ULONG NewParent)
IN BOOLEAN OUT PSTR Buffer
#define RFSD_KEY_TYPE_v2_STAT_DATA
struct disk_child RFSD_DISK_NODE_REF
#define STATUS_INVALID_PARAMETER
__u16 ih_free_space_reserved
VOID NTAPI CcSetDirtyPinnedData(IN PVOID BcbVoid, IN OPTIONAL PLARGE_INTEGER Lsn)
BOOLEAN RfsdSaveBuffer(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN LONGLONG Offset, IN ULONG Size, IN PVOID Buf)
#define STATUS_EVENT_DONE
VOID NTAPI FsRtlRemoveLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG SectorCount)
BOOLEAN RfsdAddMcbEntry(IN PRFSD_VCB Vcb, IN LONGLONG Lba, IN LONGLONG Length)
NTSYSAPI void WINAPI RtlInitializeBitMap(PRTL_BITMAP, PULONG, ULONG)
VOID NTAPI CcUnpinData(IN PVOID Bcb)
PUCHAR RfsdAllocateAndLoadBlock(IN PRFSD_VCB Vcb, IN ULONG BlockIndex)
#define RFSD_FIRST_DATA_BLOCK
RFSD_KEY_COMPARISON CompareKeysWithoutOffset(IN PRFSD_KEY_IN_MEMORY a, IN PRFSD_KEY_IN_MEMORY b)
NTSTATUS RfsdParseFilesystemTree(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY Key, IN ULONG StartingBlockNumber, IN RFSD_CALLBACK(fpDirectoryCallback), IN PVOID pContext)
BOOLEAN RfsdLookupMcbEntry(IN PRFSD_VCB Vcb, IN LONGLONG Offset, OUT PLONGLONG Lba OPTIONAL, OUT PLONGLONG Length OPTIONAL, OUT PLONGLONG RunStart OPTIONAL, OUT PLONGLONG RunLength OPTIONAL, OUT PULONG Index OPTIONAL)
IN PVOID IN PVOID IN USHORT IN USHORT Size
BOOLEAN RfsdLoadBlock(IN PRFSD_VCB Vcb, IN ULONG dwBlk, IN OUT PVOID Buffer)
#define RtlCheckBit(BMH, BP)
NTSTATUS RfsdLoadItem(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY pItemKey, OUT PRFSD_ITEM_HEAD *ppMatchingItemHeader, OUT PUCHAR *ppItemBuffer, OUT PUCHAR *ppBlockBuffer, OUT PULONG pBlockNumber, IN RFSD_KEY_COMPARISON(*fpComparisonFunction)(PRFSD_KEY_IN_MEMORY, PRFSD_KEY_IN_MEMORY))
BOOLEAN RfsdSaveGroup(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG Group)
NTSTATUS RfsdExpandInode(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, ULONG *dwRet)
#define RFSD_CALLBACK(name)
NTSTATUS RfsdNewInode(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, ULONG GroupHint, ULONG mode, PULONG Inode)
struct reiserfs_key * PRFSD_KEY_ON_DISK
#define STATUS_INVALID_HANDLE
VOID RfsdRepinBcb(IN PRFSD_IRP_CONTEXT IrpContext, IN PBCB Bcb)
#define RFSD_KEY_VERSION_2
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
BOOLEAN NTAPI FsRtlGetNextLargeMcbEntry(IN PLARGE_MCB Mcb, IN ULONG RunIndex, OUT PLONGLONG Vbn, OUT PLONGLONG Lbn, OUT PLONGLONG SectorCount)
BOOLEAN SuperblockContainsMagicKey(PRFSD_SUPER_BLOCK sb)
#define RFSD_KEY_TYPE_v1_DIRECT
__GNU_EXTENSION typedef __int64 * PLONGLONG
#define RFSD_KEY_TYPE_v1_STAT_DATA
BOOLEAN RfsdSaveSuper(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb)
#define STATUS_NOT_A_DIRECTORY
_In_ WDFDEVICE _In_ WDF_SPECIAL_FILE_TYPE FileType
NTSTATUS RfsdBuildBDL2(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY pKey, IN PRFSD_INODE pInode, OUT PULONG out_Count, OUT PRFSD_BDL *out_ppBdl)
RFSD_KEY_COMPARISON CompareShortKeys(IN PRFSD_KEY_IN_MEMORY a, IN PRFSD_KEY_IN_MEMORY b)
#define EXCEPTION_EXECUTE_HANDLER
NTSTATUS RfsdGetBlock(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG dwContent, IN ULONG Index, IN ULONG Layer, IN BOOLEAN bAlloc, OUT PULONG pBlock)
NTSTATUS RfsdTruncateInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Fcb)
NTSTATUS RfsdReadInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY Key, IN PRFSD_INODE Inode, IN ULONGLONG Offset, IN PVOID Buffer, IN ULONG Size, OUT PULONG dwReturn)
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFKEY * Key
NTSYSAPI ULONG WINAPI RtlFindClearBits(PCRTL_BITMAP, ULONG, ULONG)
struct disk_child * PRFSD_DISK_NODE_REF
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 GLint GLint j
NTSTATUS RfsdWriteInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG InodeNo, IN PRFSD_INODE Inode, IN ULONGLONG Offset, IN PVOID Buffer, IN ULONG Size, IN BOOLEAN bWriteToDisk, OUT PULONG dwReturn)
GLenum GLuint GLint GLint layer
GLboolean GLboolean GLboolean b
ULONG RfsdLog2(ULONG Value)
BOOLEAN RfsdCopyRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN BOOLEAN Wait, OUT PVOID Buffer, OUT PIO_STATUS_BLOCK IoStatus)
NTSTATUS RfsdBlockMap(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG InodeNo, IN PRFSD_INODE Inode, IN ULONG Index, IN BOOLEAN bAlloc, OUT PULONG pBlock)
NTSTATUS _NavigateToLeafNode(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY Key, IN ULONG StartingBlockNumber, OUT PULONG out_NextBlockNumber, IN BOOLEAN ReturnOnFirstMatch, IN RFSD_KEY_COMPARISON(*fpComparisonFunction)(PRFSD_KEY_IN_MEMORY, PRFSD_KEY_IN_MEMORY), RFSD_CALLBACK(fpDirectoryCallback), IN PVOID pContext)
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
BOOLEAN RfsdLoadGroup(IN PRFSD_VCB Vcb)
__u32 ConvertKeyTypeUniqueness(__u32 k_uniqueness)
BOOLEAN RfsdGetInodeLba(IN PRFSD_VCB Vcb, IN __u32 DirectoryID, IN __u32 ParentID, OUT PLONGLONG offset)
BOOLEAN RfsdSaveInode(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG inode, IN PRFSD_INODE Inode)
PRFSD_SUPER_BLOCK RfsdLoadSuper(IN PRFSD_VCB Vcb, IN BOOLEAN bVerify)
BOOLEAN NTAPI CcPinRead(IN PFILE_OBJECT FileObject, IN PLARGE_INTEGER FileOffset, IN ULONG Length, IN ULONG Flags, OUT PVOID *Bcb, OUT PVOID *Buffer)
ULONG RfsdInodeTime(IN LARGE_INTEGER SysTime)
BOOLEAN NTAPI FsRtlAddLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, IN LONGLONG Lbn, IN LONGLONG SectorCount)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
_In_ FLT_PREOP_CALLBACK_STATUS CallbackStatus
void FillInMemoryKey(IN PRFSD_KEY_ON_DISK pKeyOnDisk, IN RFSD_KEY_VERSION KeyVersion, IN OUT PRFSD_KEY_IN_MEMORY pKeyInMemory)
BOOLEAN RfsdSaveBlock(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN ULONG dwBlk, IN PVOID Buf)
_Must_inspect_result_ _In_ PFLT_INSTANCE _Out_ PBOOLEAN IsDirectory
#define memcpy(s1, s2, n)
RFSD_KEY_VERSION DetermineOnDiskKeyFormat(const PRFSD_KEY_ON_DISK key)
#define RFSD_KEY_VERSION_UNKNOWN
#define RFSD_LEAF_BLOCK_LEVEL
_In_ ULONG _In_ ULONG Offset
NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP, ULONG, ULONG)
BOOLEAN NTAPI FsRtlLookupLargeMcbEntry(IN PLARGE_MCB Mcb, IN LONGLONG Vbn, OUT PLONGLONG Lbn OPTIONAL, OUT PLONGLONG SectorCountFromLbn OPTIONAL, OUT PLONGLONG StartingLbn OPTIONAL, OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL, OUT PULONG Index OPTIONAL)
#define AbnormalTermination()
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
NTSTATUS RfsdExpandBlock(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, PRFSD_FCB Fcb, ULONG dwContent, ULONG Index, ULONG layer, BOOLEAN bNew, ULONG *dwRet)
NTSTATUS RfsdRemoveEntry(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Dcb, IN ULONG FileType, IN ULONG Inode)
NTSYSAPI void WINAPI RtlSetBits(PRTL_BITMAP, ULONG, ULONG)
#define SUPER_BLOCK_OFFSET
#define RFSD_KEY_TYPE_v2_DIRENTRY
#define RFSD_KEY_TYPE_v1_INDIRECT
short RFSD_KEY_COMPARISON
RFSD_KEY_COMPARISON CompareKeys(IN PRFSD_KEY_IN_MEMORY a, IN PRFSD_KEY_IN_MEMORY b)
NTSTATUS RfsdTruncateBlock(IN PRFSD_IRP_CONTEXT IrpContext, IN PRFSD_VCB Vcb, IN PRFSD_FCB Fcb, IN ULONG dwContent, IN ULONG Index, IN ULONG layer, OUT BOOLEAN *bFreed)
#define RFSD_KEY_TYPE_v2_DIRECT
struct block_head * PRFSD_BLOCK_HEAD
NTSTATUS NavigateToLeafNode(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY Key, IN ULONG StartingBlockNumber, OUT PULONG out_NextBlockNumber)
VOID RfsdRemoveMcbEntry(IN PRFSD_VCB Vcb, IN LONGLONG Lba, IN LONGLONG Length)
#define RFSD_KEY_VERSION_1
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
#define RFSD_KEY_TYPE_v2_INDIRECT
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
#define _SEH2_EXCEPT(...)
GLuint GLuint GLsizei GLenum type
GLboolean GLboolean GLboolean GLboolean a
NTSTATUS RfsdNewBlock(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, ULONG GroupHint, ULONG BlockHint, PULONG dwRet)
IN PDCB IN POEM_STRING OemName
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
BOOLEAN RfsdLoadInode(IN PRFSD_VCB Vcb, IN PRFSD_KEY_IN_MEMORY pKey, IN OUT PRFSD_INODE Inode)
_In_ PIO_STACK_LOCATION _Inout_ PFILE_OBJECT _Inout_ PVCB _Outptr_result_maybenull_ PDCB * Dcb
BOOLEAN RfsdFreeInode(PRFSD_IRP_CONTEXT IrpContext, PRFSD_VCB Vcb, ULONG Inode, ULONG Type)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
VOID RfsdStartFloppyFlushDpc(PRFSD_VCB Vcb, PRFSD_FCB Fcb, PFILE_OBJECT FileObject)