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;
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)))
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;
1896 (n < Cache->BlocksPerFrame)) {
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;
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::@987::@989 ReadWrite
struct _W_CACHE_ASYNC * NextWContext
struct _W_CACHE_ASYNC * PrevWContext
UDF_PH_CALL_CONTEXT PhContext
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