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);
225 if(!(
Cache->FrameList =
230 if(!(
Cache->CachedBlocksList =
235 if(!(
Cache->CachedModifiedBlocksList =
240 if(!(
Cache->CachedFramesList =
250 Cache->BlocksPerFrame = BlocksPerFrame;
251 Cache->BlocksPerFrameSh = BlocksPerFrameSh;
252 Cache->BlockCount = 0;
253 Cache->MaxBlocks = MaxBlocks;
254 Cache->MaxBytesToRead = MaxBytesToRead;
255 Cache->FrameCount = 0;
256 Cache->MaxFrames = MaxFrames;
258 Cache->PacketSizeSh = PacketSizeSh;
259 Cache->BlockSize = BlockSize;
260 Cache->BlockSizeSh = BlockSizeSh;
261 Cache->WriteCount = 0;
262 Cache->FirstLba = FirstLba;
263 Cache->LastLba = LastLba;
270 Cache->FramesToKeepFree = FramesToKeepFree;
271 Cache->WriteProc = WriteProc;
272 Cache->ReadProc = ReadProc;
273 Cache->WriteProcAsync = WriteProcAsync;
274 Cache->ReadProcAsync = ReadProcAsync;
275 Cache->CheckUsedProc = CheckUsedProc;
276 Cache->UpdateRelocProc = UpdateRelocProc;
277 Cache->ErrorHandlerProc = ErrorHandlerProc;
279 if(!(
Cache->tmp_buff =
284 if(!(
Cache->tmp_buff_r =
289 if(!(
Cache->reloc_tab =
295 UDFPrint((
"Cache init err (res)\n"));
311 if(
Cache->CachedBlocksList)
313 if(
Cache->CachedModifiedBlocksList)
315 if(
Cache->CachedFramesList)
317 if(
Cache->tmp_buff_r)
325 Cache->Tag = 0xCAC11E00;
356 if(!(
Cache->BlockCount))
373 if(!(
Cache->WriteCount))
397 if(!(
Cache->FrameCount))
403 for(
i=0;
i<
Cache->FrameCount;
i++) {
405 j =
Cache->CachedFramesList[
i];
407 mod |= (
Cache->FrameList[
j].UpdateCount != 0);
408 uc =
Cache->FrameList[
j].UpdateCount*32 +
Cache->FrameList[
j].AccessCount;
417 lba = frame <<
Cache->BlocksPerFrameSh;
420 lba = frame <<
Cache->BlocksPerFrameSh;
422 for(
i=0;
i<
Cache->FrameCount;
i++) {
424 j =
Cache->CachedFramesList[
i];
425 Cache->FrameList[
j].UpdateCount = (
Cache->FrameList[
j].UpdateCount*2)/3;
426 Cache->FrameList[
j].AccessCount = (
Cache->FrameList[
j].AccessCount*3)/4;
443 #pragma warning(push) 444 #pragma warning(disable:4035) // re-enable below 458 #if defined(_X86_) && defined(_MSC_VER) && !defined(__clang__) 469 __asm mov
ebx,BlockCount
492 __asm jne NO_r_sub_l_eq_1
535 #else // NO X86 optimization , use generic C/C++ 545 right = BlockCount - 1;
571 #pragma warning(pop) // re-enable warning #4035 608 #ifdef WCACHE_BOUND_CHECKS 610 #endif //WCACHE_BOUND_CHECKS 614 for(; firstPos<lastPos; firstPos++) {
615 #ifdef WCACHE_BOUND_CHECKS 617 #endif //WCACHE_BOUND_CHECKS 621 (*BlockCount) += offs;
644 if(firstPos && (
List[firstPos-1] ==
Lba))
649 #ifdef WCACHE_BOUND_CHECKS 651 #endif //WCACHE_BOUND_CHECKS 655 #ifdef WCACHE_BOUND_CHECKS 657 #endif //WCACHE_BOUND_CHECKS 684 ULONG offs = lastPos - firstPos;
689 (*BlockCount) -= offs;
710 if(!(*BlockCount))
return;
712 if(!lastPos || (lastPos && (
List[lastPos-1] !=
Lba)))
752 Cache->FrameList[frame].Frame = block_array;
767 ASSERT(old_count < Cache->FrameCount);
792 block_array =
Cache->FrameList[frame].Frame;
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;
957 if(!
Cache->ErrorHandlerProc)
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);
1271 frame = WContext->
Lba >>
Cache->BlocksPerFrameSh;
1272 firstLba = frame <<
Cache->BlocksPerFrameSh;
1276 Cache->FrameList[frame].Frame,
1277 WContext->
Lba - firstLba, PSs);
1283 (*FirstWContext) =
NULL;
1284 (*PrevWContext) =
NULL;
1315 if(!
Cache->FrameCount && !
Cache->BlockCount) {
1320 if(
Cache->FrameCount > (
Cache->MaxFrames*3)/4) {
1323 for(
i=
Cache->FrameCount;
i>0;
i--) {
1324 frame =
Cache->CachedFramesList[
i-1];
1326 if(!(
Cache->FrameList[frame].BlockCount)) {
1334 if(!
Cache->BlockCount) {
1339 switch(
Cache->Mode) {
1380 ULONG try_count = 0;
1384 ULONG FreeFrameCount = 0;
1388 ULONG chain_count = 0;
1391 FreeFrameCount =
Cache->FramesToKeepFree;
1397 FreeFrameCount =
Cache->FramesToKeepFree;
1398 goto Try_Another_Frame;
1401 while((
Cache->FrameCount >=
Cache->MaxFrames) || FreeFrameCount) {
1403 if(!
Cache->FrameCount || !
Cache->BlockCount) {
1405 if(
Cache->FrameCount) {
1406 UDFPrint((
"ASSERT: Cache->FrameCount = %d, when 0 is expected\n",
Cache->FrameCount));
1409 if(!
Cache->FrameCount)
1415 if(
Cache->FrameList[frame].WriteCount) {
1422 if(
Cache->FrameList[frame].UpdateCount) {
1432 firstLba = frame <<
Cache->BlocksPerFrameSh;
1433 lastLba = firstLba +
Cache->BlocksPerFrame;
1436 block_array =
Cache->FrameList[frame].Frame;
1444 while(firstPos < lastPos) {
1446 Lba =
List[firstPos] & ~(PSs-1);
1458 while((firstPos < lastPos) && (
Lba >
List[firstPos])) {
1493 frame =
Lba >>
Cache->BlocksPerFrameSh;
1494 firstLba = frame <<
Cache->BlocksPerFrameSh;
1497 block_array =
Cache->FrameList[frame].Frame;
1511 goto Try_Another_Block;
1520 if(!(
Cache->FrameList[frame].BlockCount)) {
1560 frame =
List[firstPos] >>
Cache->BlocksPerFrameSh;
1561 firstLba = frame <<
Cache->BlocksPerFrameSh;
1563 while(firstPos < lastPos) {
1575 tmp_buff =
Cache->tmp_buff;
1578 while((firstPos+
n < lastPos) &&
1579 (
List[firstPos+
n] == PrevLba+1)) {
1613 for(
i=0;
i<
n;
i++) {
1653 ULONG FreeFrameCount = 0;
1657 FreeFrameCount =
Cache->FramesToKeepFree;
1663 FreeFrameCount =
Cache->FramesToKeepFree;
1664 goto Try_Another_Frame;
1667 while((
Cache->FrameCount >=
Cache->MaxFrames) || FreeFrameCount) {
1670 if(!
Cache->FrameCount || !
Cache->BlockCount) {
1673 if(!
Cache->FrameCount)
1679 if(
Cache->FrameList[frame].WriteCount) {
1698 firstLba = frame <<
Cache->BlocksPerFrameSh;
1699 lastLba = firstLba +
Cache->BlocksPerFrame;
1702 block_array =
Cache->FrameList[frame].Frame;
1734 frame =
Lba >>
Cache->BlocksPerFrameSh;
1735 firstLba = frame <<
Cache->BlocksPerFrameSh;
1738 block_array =
Cache->FrameList[frame].Frame;
1747 if(!(
Cache->FrameList[frame].BlockCount)) {
1777 while(
Cache->FrameCount) {
1779 frame =
Cache->CachedFramesList[0];
1781 firstLba = frame <<
Cache->BlocksPerFrameSh;
1782 lastLba = firstLba +
Cache->BlocksPerFrame;
1785 block_array =
Cache->FrameList[frame].Frame;
1825 while(
Cache->WriteCount) {
1827 frame =
Cache->CachedModifiedBlocksList[0] >>
Cache->BlocksPerFrameSh;
1829 firstLba = frame <<
Cache->BlocksPerFrameSh;
1830 lastLba = firstLba +
Cache->BlocksPerFrame;
1833 block_array =
Cache->FrameList[frame].Frame;
1881 frame =
Lba >>
Cache->BlocksPerFrameSh;
1882 i =
Lba - (frame <<
Cache->BlocksPerFrameSh);
1885 block_array =
Cache->FrameList[frame].Frame;
1935 _ReadBytes =
PS<<BSh;
1948 sector_added =
TRUE;
1954 Cache->FrameList[frame].BlockCount++;
1969 sector_added =
TRUE;
1980 if(
Cache->RememberBB) {
1988 Cache->FrameList[frame].BlockCount++;
1989 if(err_count >= 2) {
2051 (*ReadBytes) += _ReadBytes;
2060 if((Lba < Cache->FirstLba) ||
2072 frame =
Lba >>
Cache->BlocksPerFrameSh;
2073 i =
Lba - (frame <<
Cache->BlocksPerFrameSh);
2105 block_array =
Cache->FrameList[frame].Frame;
2116 Cache->FrameList[frame].AccessCount++;
2118 if(
i >=
Cache->BlocksPerFrame) {
2120 block_array =
Cache->FrameList[frame].Frame;
2121 i -=
Cache->BlocksPerFrame;
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) {
2247 Cache->FrameList[frame].BlockCount++;
2324 (*WrittenBytes) += _WrittenBytes;
2333 if((Lba < Cache->FirstLba) ||
2341 frame =
Lba >>
Cache->BlocksPerFrameSh;
2342 i =
Lba - (frame <<
Cache->BlocksPerFrameSh);
2351 block_array =
Cache->FrameList[frame].Frame;
2356 (
i+BCount <= Cache->BlocksPerFrame) &&
2357 !
Cache->NoWriteThrough) {
2378 WriteThrough =
TRUE;
2383 ((
Lba & ~PacketMask) != ((
Lba+
BCount-1) & ~PacketMask))
2385 WriteThrough =
TRUE;
2386 WTh_Lba =
Lba & ~PacketMask;
2390 Cache->FrameList[frame].UpdateCount++;
2393 if(
i >=
Cache->BlocksPerFrame) {
2395 block_array =
Cache->FrameList[frame].Frame;
2396 i -=
Cache->BlocksPerFrame;
2409 (i < Cache->BlocksPerFrame) &&
2413 if(
Cache->NoWriteBB &&
2423 *WrittenBytes +=
BS;
2431 (i < Cache->BlocksPerFrame) &&
2434 if(!block_array[
i].Sector) {
2443 *WrittenBytes +=
BS;
2445 Cache->FrameList[frame].BlockCount ++;
2449 if(!
Cache->NoWriteThrough
2451 ( !(
i & PacketMask) ||
2455 (i < Cache->BlocksPerFrame) &&
2485 *WrittenBytes +=
PS<<BSh;
2492 (i < Cache->BlocksPerFrame) &&
2495 if(!block_array[
i].Sector) {
2504 *WrittenBytes +=
BS;
2506 Cache->FrameList[frame].BlockCount ++;
2518 if(WriteThrough && !
BCount) {
2527 frame =
Lba >>
Cache->BlocksPerFrameSh;
2532 block_array =
Cache->FrameList[frame].Frame;
2564 if(!(
Cache->ReadProc))
return;
2567 switch(
Cache->Mode) {
2594 if(!(
Cache->ReadProc))
return;
2597 switch(
Cache->Mode) {
2641 ULONG chain_count = 0;
2643 if(!(
Cache->ReadProc))
return;
2645 while(
Cache->BlockCount) {
2647 frame =
Lba >>
Cache->BlocksPerFrameSh;
2648 firstLba = frame <<
Cache->BlocksPerFrameSh;
2651 block_array =
Cache->FrameList[frame].Frame;
2666 if(!(
Cache->FrameList[frame].BlockCount)) {
2710 ULONG chain_count = 0;
2712 if(!(
Cache->ReadProc))
return;
2715 while(
Cache->WriteCount) {
2718 firstLba = frame << BFs;
2721 block_array =
Cache->FrameList[frame].Frame;
2732 for(
i=0;
i<PSs;
i++) {
2747 for(
i=0;
i<
Cache->BlockCount;
i++) {
2749 frame =
Lba >>
Cache->BlocksPerFrameSh;
2750 firstLba = frame <<
Cache->BlocksPerFrameSh;
2751 block_array =
Cache->FrameList[frame].Frame;
2775 Cache->Tag = 0xDEADCACE;
2776 if(!(
Cache->ReadProc))
return;
2779 for(
i=0;
i<
Cache->FrameCount;
i++) {
2780 j =
Cache->CachedFramesList[
i];
2781 block_array =
Cache->FrameList[
j].Frame;
2783 for(
k=0;
k<
Cache->BlocksPerFrame;
k++) {
2791 if(
Cache->FrameList)
2793 if(
Cache->CachedBlocksList)
2795 if(
Cache->CachedModifiedBlocksList)
2797 if(
Cache->CachedFramesList)
2799 if(
Cache->tmp_buff_r)
2801 if(
Cache->CachedFramesList)
2803 if(
Cache->CachedFramesList)
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;
2861 block_array =
Cache->FrameList[frame].Frame;
2864 Lba += (1 << BFs) - PSs;
2873 for(
i=0;
i<PSs;
i++) {
2912 if((Lba < Cache->FirstLba) ||
2920 switch(
Cache->Mode) {
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));
2982 frame =
Lba >>
Cache->BlocksPerFrameSh;
2983 i =
Lba - (frame <<
Cache->BlocksPerFrameSh);
2992 block_array =
Cache->FrameList[frame].Frame;
2994 Cache->FrameList[frame].UpdateCount+=8;
2996 Cache->FrameList[frame].AccessCount+=8;
3020 if(
Cache->RememberBB) {
3046 Cache->FrameList[frame].BlockCount ++;
3057 #ifndef UDF_CHECK_UTIL 3061 UDFPrint((
"LBA %#x is not marked as used\n",
Lba));
3070 (*CachedBlock) =
addr;
3138 if((Lba < Cache->FirstLba) ||
3143 frame =
Lba >>
Cache->BlocksPerFrameSh;
3144 i =
Lba - (frame <<
Cache->BlocksPerFrameSh);
3146 block_array =
Cache->FrameList[frame].Frame;
3152 if(
i >=
Cache->BlocksPerFrame) {
3154 block_array =
Cache->FrameList[frame].Frame;
3155 i -=
Cache->BlocksPerFrame;
3162 (i < Cache->BlocksPerFrame) &&
3172 (i < Cache->BlocksPerFrame)
3232 frame =
Lba >>
Cache->BlocksPerFrameSh;
3233 firstLba = frame <<
Cache->BlocksPerFrameSh;
3235 block_array =
Cache->FrameList[frame].Frame;
3243 if(
Cache->WriteCount < MaxReloc)
goto WCCL_retry_1;
3249 for(
i=0;
i<MaxReloc;
i++) {
3250 Lba =
Cache->CachedModifiedBlocksList[firstPos];
3251 frame =
Lba >>
Cache->BlocksPerFrameSh;
3252 firstLba = frame <<
Cache->BlocksPerFrameSh;
3253 block_array =
Cache->FrameList[frame].Frame;
3263 if(!
Cache->FrameList[frame].BlockCount) {
3266 if(firstPos >=
Cache->WriteCount) firstPos=0;
3277 if((
i =
Cache->BlockCount -
Cache->WriteCount) > MaxReloc)
i = MaxReloc;
3281 frame =
Lba >>
Cache->BlocksPerFrameSh;
3282 firstLba = frame <<
Cache->BlocksPerFrameSh;
3283 block_array =
Cache->FrameList[frame].Frame;
3294 if(!
Cache->FrameList[frame].BlockCount) {
3297 if(firstPos >=
Cache->WriteCount) firstPos=0;
3331 ULONG RelocCount = 0;
3336 while(
Cache->WriteCount <
Cache->BlockCount) {
3339 frame =
Lba >>
Cache->BlocksPerFrameSh;
3340 firstLba = frame <<
Cache->BlocksPerFrameSh;
3341 block_array =
Cache->FrameList[frame].Frame;
3358 if(!
Cache->FrameList[frame].BlockCount) {
3369 PacketTail =
Cache->WriteCount & (MaxReloc-1);
3370 IncompletePacket = (
Cache->WriteCount >= MaxReloc) ?
FALSE :
TRUE;
3373 while((
Cache->WriteCount > PacketTail) || (
Cache->WriteCount && IncompletePacket)) {
3376 frame =
Lba >>
Cache->BlocksPerFrameSh;
3377 firstLba = frame <<
Cache->BlocksPerFrameSh;
3378 block_array =
Cache->FrameList[frame].Frame;
3390 reloc_tab[RelocCount] =
Lba;
3393 if((RelocCount >= MaxReloc) || (
Cache->BlockCount == 1)) {
3412 if(!
Cache->FrameList[frame].BlockCount) {
3459 return Cache->WriteCount;
3486 ULONG RelocCount = 0;
3489 IncompletePacket = (
Cache->WriteCount >= MaxReloc) ?
FALSE :
TRUE;
3491 for(
ULONG i=0; IncompletePacket && (
i<
Cache->BlockCount);
i++) {
3494 frame =
Lba >>
Cache->BlocksPerFrameSh;
3495 firstLba = frame <<
Cache->BlocksPerFrameSh;
3496 block_array =
Cache->FrameList[frame].Frame;
3504 reloc_tab[RelocCount] =
Lba;
3506 if(RelocCount >=
Cache->WriteCount) {
3547 while((
List[
i] < (ReqLba+
BCount)) && (i < Cache->BlockCount)) {
3550 frame =
Lba >>
Cache->BlocksPerFrameSh;
3551 firstLba = frame <<
Cache->BlocksPerFrameSh;
3552 block_array =
Cache->FrameList[frame].Frame;
3570 if(!
Cache->FrameList[frame].BlockCount) {
3620 if(
Cache->RememberBB) {
3643 if(SetFlags || ClrFlags) {
3644 Flags = (
Cache->Flags & ~ClrFlags) | SetFlags;
3650 return Cache->Flags;
VOID __fastcall WCachePurgeAllRW(IN PW_CACHE Cache, IN PVOID Context)
#define KeQuerySystemTime(t)
#define ExGetCurrentResourceThread()
#define ASYNC_STATE_WRITE
VOID __fastcall WCacheInsertRangeToList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba, IN ULONG BCount)
#define WCACHE_CHAINED_IO
#define STATUS_INSUFFICIENT_RESOURCES
static void xor(unsigned char *dst, const unsigned char *a, const unsigned char *b, const int count)
VOID WCacheRelease__(IN PW_CACHE Cache)
#define DbgAllocatePoolWithTag(a, b, c)
OSSTATUS __fastcall WCacheCheckLimitsRW(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
VOID WCacheSyncReloc__(IN PW_CACHE Cache, IN PVOID Context)
IN BOOLEAN OUT PSTR Buffer
OSSTATUS(* PWRITE_BLOCK)(IN PVOID Context, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T WrittenBytes, IN uint32 Flags)
lba_t __fastcall WCacheFindModifiedLbaToRelease(IN PW_CACHE Cache)
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx eax jnz xchgl ecx incl TEMP esi
#define STATUS_INVALID_PARAMETER
struct _W_CACHE_ENTRY * PW_CACHE_ENTRY
#define WCACHE_BLOCK_USED
VOID __fastcall WCachePurgeAllR(IN PW_CACHE Cache, IN PVOID Context)
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)
OSSTATUS __fastcall WCacheDecodeFlags(IN PW_CACHE Cache, IN ULONG Flags)
lba_t __fastcall WCacheFindFrameToRelease(IN PW_CACHE Cache)
NTSTATUS ExInitializeResourceLite(PULONG res)
NTSTATUS NTAPI ExDeleteResourceLite(IN PERESOURCE Resource)
#define WCACHE_RO_BAD_BLOCKS
LONGLONG WCacheRandom(VOID)
ios_base &_STLP_CALL dec(ios_base &__s)
#define WCACHE_MARK_BAD_BLOCKS
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 WCacheFlushBlocksRW(IN PW_CACHE Cache, IN PVOID Context, IN lba_t _Lba, IN ULONG BCount)
#define cmp(status, error)
lba_t __fastcall WCacheFindLbaToRelease(IN PW_CACHE Cache)
static calc_node_t * pop(void)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
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 WCacheFreeSector(frame, offs)
#define WCACHE_CACHE_WHOLE_PACKET
OSSTATUS __fastcall WCacheCheckLimits(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
OSSTATUS(* PREAD_BLOCK)(IN PVOID Context, IN PVOID Buffer, IN SIZE_T Length, IN lba_t Lba, OUT PSIZE_T ReadBytes, IN uint32 Flags)
VOID WCachePurgeAll__(IN PW_CACHE Cache, IN PVOID Context)
#define WCacheSetModFlag(block_array, i)
BOOLEAN NTAPI ExAcquireResourceExclusiveLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
VOID WCacheFlushAll__(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS __fastcall WCacheFlushAllRAM(IN PW_CACHE Cache, IN PVOID Context)
VOID __fastcall WCacheFlushAllRW(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS WCacheCompleteAsync__(IN PVOID WContext, IN OSSTATUS Status)
BOOLEAN WCacheIsCached__(IN PW_CACHE Cache, IN lba_t Lba, IN ULONG BCount)
VOID WCacheFreePacket(IN PW_CACHE Cache, IN ULONG frame, IN PW_CACHE_ENTRY block_array, IN ULONG offs, IN ULONG PSs)
ULONG WCacheChFlags__(IN PW_CACHE Cache, IN ULONG SetFlags, IN ULONG ClrFlags)
#define WCACHE_VALID_FLAGS
OSSTATUS __fastcall WCacheCheckLimitsRAM(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
ULONG WCacheGetSortedListIndex(IN ULONG BlockCount, IN lba_t *List, IN lba_t Lba)
struct _ACPI_EFI_BOOT_SERVICES * BS
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)
ULONG(* PCHECK_BLOCK)(IN PVOID Context, IN lba_t Lba)
#define WCacheSectorAddr(block_array, i)
OSSTATUS __fastcall WCachePurgeAllRAM(IN PW_CACHE Cache, IN PVOID Context)
VOID __fastcall WCacheRemoveItemFromList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba)
#define WCACHE_ERROR_READ
#define DbgWaitForSingleObject(o, to)
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)
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 WCacheClrModFlag(block_array, i)
_Must_inspect_result_ _In_ ULONG Flags
VOID WCacheDiscardBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl eax
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx movl TEMP incl eax andl eax ecx incl ebx eax jnz xchgl ecx incl TEMP esp ecx subl ebx pushl ecx ecx edx ecx 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 mm1 mm5 paddd mm0 paddd mm4 mm0 mm4 packssdw mm0 packssdw mm4 mm1 punpckldq mm0 pand mm1 pand mm0 por mm1 movq edi esi edx edi decl ecx jnz popl ecx ecx jecxz mm0 mm0 mm1 mm1 mm2 mm2 mm3 mm3 paddd mm0 paddd mm0 paddd mm0 movq mm1 mm1 paddd mm0 mm0 packssdw mm0 movd eax movw edi esi edx edi
#define WCACHE_BLOCK_ZERO
struct _W_CACHE_ASYNC * PrevWContext
struct _W_CACHE_ASYNC * PW_CACHE_ASYNC
VOID __fastcall WCacheRemoveFrame(IN PW_CACHE Cache, IN PVOID Context, IN ULONG frame)
PW_CACHE_ENTRY __fastcall WCacheInitFrame(IN PW_CACHE Cache, IN PVOID Context, IN ULONG frame)
__in PWDFDEVICE_INIT __in BOOLEAN Exclusive
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl ebx
ULONG WCacheGetMode__(IN PW_CACHE Cache)
struct _W_CACHE_ASYNC W_CACHE_ASYNC
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)
#define STATUS_DRIVER_INTERNAL_ERROR
IO_STATUS_BLOCK IosbToUse
OSSTATUS __fastcall WCacheCheckLimitsR(IN PW_CACHE Cache, IN PVOID Context, IN lba_t ReqLba, IN ULONG BCount)
OSSTATUS WCachePreReadPacket__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba)
VOID __fastcall WCacheInsertItemToList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba)
GLenum const GLvoid * addr
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
#define WCACHE_ERROR_WRITE
_Must_inspect_result_ _In_ WDFCMRESLIST List
VOID __fastcall WCacheRemoveRangeFromList(IN lba_t *List, IN PULONG BlockCount, IN lba_t Lba, IN ULONG BCount)
UDF_PH_CALL_CONTEXT PhContext
OSSTATUS WCacheEODirect__(IN PW_CACHE Cache, IN PVOID Context)
OSSTATUS WCacheStartDirect__(IN PW_CACHE Cache, IN PVOID Context, IN BOOLEAN Exclusive)
#define CACHED_BLOCK_MEMORY_TYPE
ULONG WCacheGetWriteBlockCount__(IN PW_CACHE Cache)
#define KeInitializeEvent(pEvt, foo, foo2)
OSSTATUS WCacheDirect__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba, IN BOOLEAN Modified, OUT PCHAR *CachedBlock, IN BOOLEAN CachedOnly)
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 WCacheFreeAsyncEntry(IN PW_CACHE Cache, PW_CACHE_ASYNC WContext)
BOOLEAN WCacheIsInitialized__(IN PW_CACHE Cache)
OSSTATUS __fastcall WCacheFlushBlocksRAM(IN PW_CACHE Cache, IN PVOID Context, PW_CACHE_ENTRY block_array, lba_t *List, ULONG firstPos, ULONG lastPos, BOOLEAN Purge)
#define WCacheGetModFlag(block_array, i)
#define ASYNC_STATE_WRITE_PRE
BOOLEAN NTAPI ExAcquireResourceSharedLite(IN PERESOURCE Resource, IN BOOLEAN Wait)
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)
#define WCACHE_DO_NOT_COMPARE
OSSTATUS WCacheFlushBlocks__(IN PW_CACHE Cache, IN PVOID Context, IN lba_t Lba, IN ULONG BCount)
#define WCACHE_INVALID_LBA
struct _WCACHE_ERROR_CONTEXT::@943::@945 ReadWrite
#define RtlZeroMemory(Destination, Length)
OSSTATUS(* PWC_ERROR_HANDLER)(IN PVOID Context, IN PWCACHE_ERROR_CONTEXT ErrorInfo)
VOID NTAPI ExReleaseResourceForThreadLite(IN PERESOURCE Resource, IN ERESOURCE_THREAD Thread)
ecx edi ebx edx edi decl ecx esi eax jecxz decl eax andl eax esi movl edx
static void push(calc_node_t *op)
static SERVICE_STATUS status
PW_CACHE_ASYNC WCacheAllocAsyncEntry(IN PW_CACHE Cache, IN OUT PW_CACHE_ASYNC *FirstWContext, IN OUT PW_CACHE_ASYNC *PrevWContext, IN ULONG BufferSize)
struct _W_CACHE_ASYNC * NextWContext
OSSTATUS WCacheSetMode__(IN PW_CACHE Cache, IN ULONG Mode)
#define WCACHE_NO_WRITE_THROUGH
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)
_CRTIMP int __cdecl read(_In_ int _FileHandle, _Out_writes_bytes_(_MaxCharCount) void *_DstBuf, _In_ unsigned int _MaxCharCount)
#define STATUS_DEVICE_DATA_ERROR
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
OSSTATUS(* PUPDATE_RELOC)(IN PVOID Context, IN lba_t Lba, IN PULONG RelocTab, IN ULONG BCount)