41#define ASYNC_STATE_NONE 0
42#define ASYNC_STATE_READ_PRE 1
43#define ASYNC_STATE_READ 2
44#define ASYNC_STATE_WRITE_PRE 3
45#define ASYNC_STATE_WRITE 4
46#define ASYNC_STATE_DONE 5
48#define ASYNC_CMD_NONE 0
49#define ASYNC_CMD_READ 1
50#define ASYNC_CMD_UPDATE 2
52#define WCACHE_MAX_CHAIN (0x10)
54#define MEM_WCCTX_TAG 'xtCW'
55#define MEM_WCFRM_TAG 'rfCW'
56#define MEM_WCBUF_TAG 'fbCW'
61 #define WcPrint UDFPrint
63 #define WcPrint(x) {;}
174 ULONG BlockSize = (1) << BlockSizeSh;
175 ULONG BlocksPerFrame = (1) << BlocksPerFrameSh;
178 ULONG res_init_flags = 0;
185 UDFPrint((
"Disable Async-Write for WORM media\n"));
186 WriteProcAsync =
NULL;
189 UDFPrint((
"Total number of sectors must be packet-size-aligned\n"));
193 UDFPrint((
"Number of sectors per Frame must be packet-size-aligned\n"));
197 UDFPrint((
"Read routine pointer must be valid\n"));
200 if(FirstLba >= LastLba) {
201 UDFPrint((
"Invalid cached area parameters: (%x - %x)\n",FirstLba, LastLba));
205 UDFPrint((
"Total frame number must be non-zero\n",FirstLba, LastLba));
212 if(FramesToKeepFree >= MaxFrames/2) {
213 UDFPrint((
"Invalid FramesToKeepFree (%x). Should be Less or equal to MaxFrames/2 (%x)\n", FramesToKeepFree, MaxFrames/2));
218 UDFPrint((
"Write routine not specified\n"));
219 UDFPrint((
"Read-only mode enabled\n"));
221 MaxBlocks =
max(MaxBlocks, BlocksPerFrame*3);
295 UDFPrint((
"Cache init err (res)\n"));
444#pragma warning(disable:4035)
458#if defined(_X86_) && defined(_MSC_VER) && !defined(__clang__)
469 __asm mov
ebx,BlockCount
492 __asm jne NO_r_sub_l_eq_1
545 right = BlockCount - 1;
608#ifdef WCACHE_BOUND_CHECKS
614 for(; firstPos<lastPos; firstPos++) {
615#ifdef WCACHE_BOUND_CHECKS
621 (*BlockCount) += offs;
644 if(firstPos && (
List[firstPos-1] ==
Lba))
649#ifdef WCACHE_BOUND_CHECKS
655#ifdef WCACHE_BOUND_CHECKS
684 ULONG offs = lastPos - firstPos;
689 (*BlockCount) -= offs;
710 if(!(*BlockCount))
return;
712 if(!lastPos || (lastPos && (
List[lastPos-1] !=
Lba)))
767 ASSERT(old_count < Cache->FrameCount);
811#define WCacheSetModFlag(block_array, i) \
812 *((PULONG)&(block_array[i].Sector)) |= WCACHE_FLAG_MODIFIED
819#define WCacheClrModFlag(block_array, i) \
820 *((PULONG)&(block_array[i].Sector)) &= ~WCACHE_FLAG_MODIFIED
828#define WCacheGetModFlag(block_array, i) \
829 (*((PULONG)&(block_array[i].Sector)) & WCACHE_FLAG_MODIFIED)
837#define WCacheSetBadFlag(block_array, i) \
838 *((PULONG)&(block_array[i].Sector)) |= WCACHE_FLAG_BAD
845#define WCacheClrBadFlag(block_array, i) \
846 *((PULONG)&(block_array[i].Sector)) &= ~WCACHE_FLAG_BAD
854#define WCacheGetBadFlag(block_array, i) \
855 (((UCHAR)(block_array[i].Sector)) & WCACHE_FLAG_BAD)
864#define WCacheSectorAddr(block_array, i) \
865 ((ULONG_PTR)(block_array[i].Sector) & WCACHE_ADDR_MASK)
873#define WCacheFreeSector(frame, offs) \
875 DbgFreePool((PVOID)WCacheSectorAddr(block_array, offs)); \
876 block_array[offs].Sector = NULL; \
877 Cache->FrameList[frame].BlockCount--; \
915 (*PrevWContext)->NextWContext = WContext;
921 if(!(*FirstWContext))
922 (*FirstWContext) = WContext;
923 (*PrevWContext) = WContext;
1020 WContext = (*PrevWContext);
1032 Lba0 =
Lba - firstLba;
1033 for(
i=0;
i<PSs;
i++, Lba0++) {
1047 if(
mod && !PrefereWrite) {
1059 if(Chained || Async) {
1107 tmp_buff2 = tmp_buff;
1117 Lba0 =
Lba - firstLba;
1118 for(
i=0;
i<PSs;
i++, Lba0++) {
1197 for(
i=0;
i<PSs;
i++, offs++) {
1262 WContext = (*FirstWContext);
1277 WContext->
Lba - firstLba, PSs);
1283 (*FirstWContext) =
NULL;
1284 (*PrevWContext) =
NULL;
1380 ULONG try_count = 0;
1384 ULONG FreeFrameCount = 0;
1388 ULONG chain_count = 0;
1398 goto Try_Another_Frame;
1444 while(firstPos < lastPos) {
1446 Lba =
List[firstPos] & ~(PSs-1);
1458 while((firstPos < lastPos) && (
Lba >
List[firstPos])) {
1511 goto Try_Another_Block;
1563 while(firstPos < lastPos) {
1578 while((firstPos+
n < lastPos) &&
1579 (
List[firstPos+
n] == PrevLba+1)) {
1613 for(
i=0;
i<
n;
i++) {
1653 ULONG FreeFrameCount = 0;
1664 goto Try_Another_Frame;
1896 (n < Cache->BlocksPerFrame)) {
1935 _ReadBytes = PS<<BSh;
1948 sector_added =
TRUE;
1969 sector_added =
TRUE;
1989 if(err_count >= 2) {
2035 ULONG PacketMask = PS-1;
2051 (*ReadBytes) += _ReadBytes;
2060 if((Lba < Cache->FirstLba) ||
2134 (i < Cache->BlocksPerFrame) &&
2150 if(!((
d =
Lba+saved_BC-
BCount) & PacketMask) &&
d ) {
2153 (i < Cache->BlocksPerFrame) &&
2184 (i < Cache->BlocksPerFrame) &&
2196 if(saved_to_read > MaxR) {
2203 _ReadBytes &= ~(
BS-1);
2204 BCount -= _ReadBytes >> BSh;
2205 saved_to_read -= _ReadBytes;
2208 goto store_read_data_1;
2211 saved_to_read -= MaxR;
2215 }
while(saved_to_read > MaxR);
2222 _ReadBytes &= ~(
BS-1);
2223 BCount -= _ReadBytes >> BSh;
2224 saved_to_read -= _ReadBytes;
2226 goto store_read_data_1;
2239 while(
to_read - saved_to_read) {
2241 if(!block_array[
i].Sector) {
2302 ULONG PacketMask = PS-1;
2324 (*WrittenBytes) += _WrittenBytes;
2333 if((Lba < Cache->FirstLba) ||
2356 (
i+BCount <= Cache->BlocksPerFrame) &&
2378 WriteThrough =
TRUE;
2383 ((
Lba & ~PacketMask) != ((
Lba+
BCount-1) & ~PacketMask))
2385 WriteThrough =
TRUE;
2386 WTh_Lba =
Lba & ~PacketMask;
2409 (i < Cache->BlocksPerFrame) &&
2423 *WrittenBytes +=
BS;
2431 (i < Cache->BlocksPerFrame) &&
2434 if(!block_array[
i].Sector) {
2443 *WrittenBytes +=
BS;
2451 ( !(
i & PacketMask) ||
2455 (i < Cache->BlocksPerFrame) &&
2485 *WrittenBytes += PS<<BSh;
2492 (i < Cache->BlocksPerFrame) &&
2495 if(!block_array[
i].Sector) {
2504 *WrittenBytes +=
BS;
2518 if(WriteThrough && !
BCount) {
2641 ULONG chain_count = 0;
2710 ULONG chain_count = 0;
2718 firstLba = frame << BFs;
2732 for(
i=0;
i<PSs;
i++) {
2849 ULONG chain_count = 0;
2855 lim = (_Lba+
BCount+PSs-1) & ~(PSs-1);
2856 for(
Lba = _Lba & ~(PSs-1);
Lba < lim ;
Lba += PSs) {
2858 firstLba = frame << BFs;
2864 Lba += (1 << BFs) - PSs;
2873 for(
i=0;
i<PSs;
i++) {
2912 if((Lba < Cache->FirstLba) ||
2967 WcPrint((
"WC:%sD %x (1)\n", Modified ?
"W" :
"R",
Lba));
2974 if((Lba < Cache->FirstLba) ||
2976 UDFPrint((
"LBA %#x is beyond cacheable area\n",
Lba));
3057#ifndef UDF_CHECK_UTIL
3061 UDFPrint((
"LBA %#x is not marked as used\n",
Lba));
3070 (*CachedBlock) =
addr;
3138 if((Lba < Cache->FirstLba) ||
3162 (i < Cache->BlocksPerFrame) &&
3172 (i < Cache->BlocksPerFrame)
3249 for(
i=0;
i<MaxReloc;
i++) {
3331 ULONG RelocCount = 0;
3390 reloc_tab[RelocCount] =
Lba;
3486 ULONG RelocCount = 0;
3504 reloc_tab[RelocCount] =
Lba;
3547 while((
List[
i] < (ReqLba+
BCount)) && (i < Cache->BlockCount)) {
3643 if(SetFlags || ClrFlags) {
std::map< E_MODULE, HMODULE > mod
ios_base &_STLP_CALL dec(ios_base &__s)
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
static void xor(unsigned char *dst, const unsigned char *a, const unsigned char *b, const int count)
#define ExReleaseResourceForThreadLite(res, thrdID)
NTSTATUS ExInitializeResourceLite(PULONG res)
#define DbgAllocatePoolWithTag(a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define ExGetCurrentResourceThread()
#define KeSetEvent(pEvt, foo, foo2)
#define DbgWaitForSingleObject(o, to)
#define KeQuerySystemTime(t)
#define ExAcquireResourceExclusiveLite(res, wait)
#define ExDeleteResourceLite(res)
#define ExAcquireResourceSharedLite(res, wait)
__in PWDFDEVICE_INIT __in BOOLEAN Exclusive
GLenum const GLvoid * addr
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
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
#define cmp(status, error)
static calc_node_t * pop(void)
static void push(calc_node_t *op)
IO_STATUS_BLOCK IosbToUse
struct _WCACHE_ERROR_CONTEXT::@1051::@1053 ReadWrite
struct _W_CACHE_ASYNC * NextWContext
struct _W_CACHE_ASYNC * PrevWContext
UDF_PH_CALL_CONTEXT PhContext
PCHECK_BLOCK CheckUsedProc
lba_t * CachedModifiedBlocksList
PREAD_BLOCK_ASYNC ReadProcAsync
PUPDATE_RELOC UpdateRelocProc
PWC_ERROR_HANDLER ErrorHandlerProc
PWRITE_BLOCK_ASYNC WriteProcAsync
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl ebx
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx shrl ecx mm0 mm4 mm0 mm4 mm1 mm5 mm1 mm5 mm2 mm6 mm2 mm6 mm3 mm7 mm3 mm7 paddd mm0 paddd mm4 paddd mm0 paddd mm4 paddd mm0 paddd mm4 movq mm1 movq mm5 psrlq mm1 psrlq mm5 paddd mm0 paddd mm4 psrad mm0 psrad mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx andl ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 psrlq mm1 paddd mm0 psrad mm0 packssdw mm0 movd eax movw edi esi edx edi
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl eax
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx testl eax jnz xchgl ecx incl TEMP esi
ecx edi movl ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx
#define RtlZeroMemory(Destination, Length)
#define STATUS_DRIVER_INTERNAL_ERROR
#define STATUS_INVALID_PARAMETER
#define STATUS_DEVICE_DATA_ERROR
#define STATUS_INSUFFICIENT_RESOURCES
VOID __fastcall WCacheRemoveItemFromList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba)
OSSTATUS WCacheWriteBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN PCHAR Buffer, IN lba_t Lba, IN ULONG BCount, OUT PSIZE_T WrittenBytes, IN BOOLEAN CachedOnly)
VOID WCacheFlushAll__(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS WCacheStartDirect__(IN PW_CACHE Cache, IN PVOID Context, IN BOOLEAN Exclusive)
struct _W_CACHE_ASYNC * PW_CACHE_ASYNC
BOOLEAN WCacheIsInitialized__(IN PW_CACHE Cache)
VOID WCacheFreeAsyncEntry(IN PW_CACHE Cache, PW_CACHE_ASYNC WContext)
OSSTATUS __fastcall WCacheFlushBlocksRAM(IN PW_CACHE Cache, IN PVOID Context, PW_CACHE_ENTRY block_array, lba_t *List, ULONG firstPos, ULONG lastPos, BOOLEAN Purge)
ULONG WCacheGetWriteBlockCount__(IN PW_CACHE Cache)
lba_t __fastcall WCacheFindLbaToRelease(IN PW_CACHE Cache)
PW_CACHE_ENTRY __fastcall WCacheInitFrame(IN PW_CACHE Cache, IN PVOID Context, IN ULONG frame)
VOID __fastcall WCacheRemoveRangeFromList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba, IN ULONG BCount)
OSSTATUS WCacheFlushBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba, IN ULONG BCount)
OSSTATUS WCacheFlushBlocksRW(IN PW_CACHE Cache, IN PVOID Context, IN lba_t _Lba, IN ULONG BCount)
#define WCacheFreeSector(frame, offs)
VOID WCacheRelease__(IN PW_CACHE Cache)
VOID WCacheFreePacket(IN PW_CACHE Cache, IN ULONG frame, IN PW_CACHE_ENTRY block_array, IN ULONG offs, IN ULONG PSs)
#define ASYNC_STATE_WRITE_PRE
struct _W_CACHE_ASYNC W_CACHE_ASYNC
OSSTATUS WCacheInit__(IN PW_CACHE Cache, IN ULONG MaxFrames, IN ULONG MaxBlocks, IN SIZE_T MaxBytesToRead, IN ULONG PacketSizeSh, IN ULONG BlockSizeSh, IN ULONG BlocksPerFrameSh, IN lba_t FirstLba, IN lba_t LastLba, IN ULONG Mode, IN ULONG Flags, IN ULONG FramesToKeepFree, IN PWRITE_BLOCK WriteProc, IN PREAD_BLOCK ReadProc, IN PWRITE_BLOCK_ASYNC WriteProcAsync, IN PREAD_BLOCK_ASYNC ReadProcAsync, IN PCHECK_BLOCK CheckUsedProc, IN PUPDATE_RELOC UpdateRelocProc, IN PWC_ERROR_HANDLER ErrorHandlerProc)
OSSTATUS __fastcall WCacheCheckLimits(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
#define ASYNC_STATE_WRITE
VOID WCacheSyncReloc__(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS __fastcall WCacheFlushAllRAM(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS __fastcall WCacheCheckLimitsR(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
OSSTATUS __fastcall WCacheDecodeFlags(IN PW_CACHE Cache, IN ULONG Flags)
PW_CACHE_ASYNC WCacheAllocAsyncEntry(IN PW_CACHE Cache, IN OUT PW_CACHE_ASYNC *FirstWContext, IN OUT PW_CACHE_ASYNC *PrevWContext, IN ULONG BufferSize)
lba_t __fastcall WCacheFindModifiedLbaToRelease(IN PW_CACHE Cache)
OSSTATUS __fastcall WCacheCheckLimitsRAM(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
VOID __fastcall WCachePurgeAllR(IN PW_CACHE Cache, IN PVOID Context)
ULONG WCacheGetSortedListIndex(IN ULONG BlockCount, IN lba_t *List, IN lba_t Lba)
#define WCacheSetModFlag(block_array, i)
OSSTATUS __fastcall WCacheCheckLimitsRW(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
VOID WCacheUpdatePacketComplete(IN PW_CACHE Cache, IN PVOID Context, IN OUT PW_CACHE_ASYNC *FirstWContext, IN OUT PW_CACHE_ASYNC *PrevWContext, IN BOOLEAN FreePacket=TRUE)
OSSTATUS WCacheReadBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN PCHAR Buffer, IN lba_t Lba, IN ULONG BCount, OUT PSIZE_T ReadBytes, IN BOOLEAN CachedOnly)
OSSTATUS WCacheCompleteAsync__(IN PVOID WContext, IN OSSTATUS Status)
VOID WCachePurgeAll__(IN PW_CACHE Cache, IN PVOID Context)
#define WCacheSectorAddr(block_array, i)
OSSTATUS WCachePreReadPacket__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba)
#define WCacheClrModFlag(block_array, i)
VOID __fastcall WCacheFlushAllRW(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS WCacheUpdatePacket(IN PW_CACHE Cache, IN PVOID Context, IN OUT PW_CACHE_ASYNC *FirstWContext, IN OUT PW_CACHE_ASYNC *PrevWContext, IN PW_CACHE_ENTRY block_array, IN lba_t firstLba, IN lba_t Lba, IN ULONG BSh, IN ULONG BS, IN ULONG PS, IN ULONG PSs, IN PSIZE_T ReadBytes, IN BOOLEAN PrefereWrite, IN ULONG State)
#define WCacheGetModFlag(block_array, i)
OSSTATUS WCacheDirect__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba, IN BOOLEAN Modified, OUT PCHAR *CachedBlock, IN BOOLEAN CachedOnly)
VOID WCacheDiscardBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
OSSTATUS WCacheRaiseIoError(IN PW_CACHE Cache, IN PVOID Context, IN OSSTATUS Status, IN ULONG Lba, IN ULONG BCount, IN PVOID Buffer, IN BOOLEAN ReadOp, IN PBOOLEAN Retry)
lba_t __fastcall WCacheFindFrameToRelease(IN PW_CACHE Cache)
OSSTATUS WCacheEODirect__(IN PW_CACHE Cache, IN PVOID Context)
ULONG WCacheGetMode__(IN PW_CACHE Cache)
VOID __fastcall WCacheInsertItemToList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba)
OSSTATUS __fastcall WCachePurgeAllRAM(IN PW_CACHE Cache, IN PVOID Context)
BOOLEAN WCacheIsCached__(IN PW_CACHE Cache, IN lba_t Lba, IN ULONG BCount)
OSSTATUS WCacheSetMode__(IN PW_CACHE Cache, IN ULONG Mode)
LONGLONG WCacheRandom(VOID)
VOID __fastcall WCacheRemoveFrame(IN PW_CACHE Cache, IN PVOID Context, IN ULONG frame)
ULONG WCacheChFlags__(IN PW_CACHE Cache, IN ULONG SetFlags, IN ULONG ClrFlags)
VOID __fastcall WCachePurgeAllRW(IN PW_CACHE Cache, IN PVOID Context)
VOID __fastcall WCacheInsertRangeToList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba, IN ULONG BCount)
#define WCACHE_BLOCK_USED
#define WCACHE_VALID_FLAGS
#define CACHED_BLOCK_MEMORY_TYPE
#define WCACHE_RO_BAD_BLOCKS
#define WCACHE_NO_WRITE_THROUGH
OSSTATUS(* PWRITE_BLOCK)(IN PVOID Context, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T WrittenBytes, IN uint32 Flags)
#define WCACHE_CACHE_WHOLE_PACKET
ULONG(* PCHECK_BLOCK)(IN PVOID Context, IN lba_t Lba)
OSSTATUS(* PREAD_BLOCK)(IN PVOID Context, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T ReadBytes, IN uint32 Flags)
OSSTATUS(* PWC_ERROR_HANDLER)(IN PVOID Context, IN PWCACHE_ERROR_CONTEXT ErrorInfo)
OSSTATUS(* PWRITE_BLOCK_ASYNC)(IN PVOID Context, IN PVOID WContext, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T WrittenBytes, IN BOOLEAN FreeBuffer)
OSSTATUS(* PUPDATE_RELOC)(IN PVOID Context, IN lba_t Lba, IN PULONG RelocTab, IN ULONG BCount)
#define WCACHE_ERROR_WRITE
struct _W_CACHE_ENTRY * PW_CACHE_ENTRY
OSSTATUS(* PREAD_BLOCK_ASYNC)(IN PVOID Context, IN PVOID WContext, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T ReadBytes)
#define WCACHE_BLOCK_ZERO
#define WCACHE_ERROR_READ
#define WCACHE_MARK_BAD_BLOCKS
#define WCACHE_INVALID_LBA
#define WCACHE_DO_NOT_COMPARE
#define WCACHE_CHAINED_IO
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_Must_inspect_result_ _In_ WDFCMRESLIST List
_Must_inspect_result_ _In_ ULONG Flags