1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6 /*************************************************************************
7 *
8 * File: env_spec_w32.h
9 *
10 * Module: User-mode applications (User mode execution only)
11 *
12 * Description:
13 *
14 *
15 * Author: Alter
16 *
17 *************************************************************************/
18 
19 #ifndef __ENV_SPEC_W32__H_
20 #define __ENV_SPEC_W32__H_
21 
22 #ifdef NT_NATIVE_MODE
23 //#include "ntddk.h" // include this for its native functions and defn's
24 #include "nt_native.h"
25 #else //NT_NATIVE_MODE
26 #include <windows.h>
27 #endif //NT_NATIVE_MODE
28 #include "platform.h"
29 //#ifndef WITHOUT_FORMATTER
30 #include "udferr_usr.h"
31 //#endif WITHOUT_FORMATTER
32 
33 #ifndef NT_NATIVE_MODE
34 #ifdef ASSERT
35   #undef ASSERT
36   #define ASSERT(a)    if(!(a)) {__asm int 3;}
37 #endif
38 #endif //NT_NATIVE_MODE
39 
40 #ifndef MAXIMUM_FILENAME_LENGTH
41 #define MAXIMUM_FILENAME_LENGTH MAX_PATH
42 #endif //MAXIMUM_FILENAME_LENGTH
43 
44 #ifndef PAGE_SHIFT
45 #define PAGE_SHIFT 12
46 #endif //PAGE_SHIFT
47 
48 #ifndef PAGE_SIZE
49 #define PAGE_SIZE (ULONG)0x1000
50 #endif //PAGE_SIZE
51 
52 #ifndef PHYSICAL_ADDRESS
53 #define PHYSICAL_ADDRESS  LARGE_INTEGER
54 #endif //PHYSICAL_ADDRESS
55 
56 #define OS_SUCCESS(a)     NT_SUCCESS(a)
57 #define OSSTATUS          NTSTATUS
58 
59 #if defined UDF_DBG || defined DEBUG
60 #define DBG
61 #ifndef CDRW_W32
62 #define UDF_DBG
63 #endif //CDRW_W32
64 #endif
65 
66 #define ERESEOURCE        ULONG
67 #define PERESEOURCE       PULONG
68 
69 #define KEVENT            ULONG
70 #define PKEVENT           PULONG
71 
72 typedef ULONG KSPIN_LOCK;  // winnt ntndis
73 typedef KSPIN_LOCK *PKSPIN_LOCK;
74 
75 #ifndef NT_NATIVE_MODE
76 // Status ot
77 #define NTSTATUS LONG
78 
79 #define NT_SUCCESS(x) ( (NTSTATUS)(x)>=0 )
80 
81 #define PsGetCurrentThread()  GetCurrentThreadId()
82 
83 #define PsGetVersion(a,b,c,d) { \
84     OSVERSIONINFO OsVer;        \
85     OsVer.dwOSVersionInfoSize = sizeof(OsVer); \
86     GetVersionEx(&OsVer); \
87     if(a) (*(a)) = OsVer.dwMajorVersion; \
88     if(b) (*(b)) = OsVer.dwMinorVersion; \
89     if(c) (*(c)) = OsVer.dwBuildNumber;  \
90     if(d) (d)->Buffer = L"";  \
91     if(d) (d)->Length = 0;  \
92     if(d) (d)->MaximumLength = 0;  \
93 }
94 
95 extern "C"
96 VOID
97 PrintDbgConsole(
98     PCHAR DebugMessage,
99     ...
100     );
101 
102 #else //NT_NATIVE_MODE
103 #define HINSTANCE HANDLE
104 #endif //NT_NATIVE_MODE
105 
106 typedef
107 int (*PSKIN_INIT) (
108     HINSTANCE hInstance,      // handle to current instance
109     HINSTANCE hPrevInstance,  // handle to previous instance
110     int nCmdShow              // show state
111     );
112 
113 typedef
114 int (*PSKIN_PRINTF) (
115     const char* Message,
116     ...
117     );
118 
119 typedef
120 PWCHAR (__stdcall *PSKIN_GETCMDLINE) (
121     VOID
122     );
123 
124 typedef
125 ULONG (__stdcall *PSKIN_MSG) (
126     ULONG MsgId,
127     ULONG MsgSubId,
128     PVOID DataIn,
129     ULONG DataInLen,
130     PVOID DataOut,
131     ULONG DataInOut
132     );
133 
134 typedef struct _SKIN_API {
135     PSKIN_INIT        Init;
136     PSKIN_PRINTF      Printf;
137     PSKIN_GETCMDLINE  GetCommandLine;
138     PSKIN_MSG         Msg;
139 } SKIN_API, *PSKIN_API;
140 
141 #ifdef USE_SKIN_MODEL
142 
143 extern "C" PSKIN_API SkinAPI;
144 extern PSKIN_API SkinLoad(
145     PWCHAR path,
146     HINSTANCE hInstance,      // handle to current instance
147     HINSTANCE hPrevInstance,  // handle to previous instance
148     int nCmdShow              // show state
149     );
150 
151 #define SkinPrintf                       SkinAPI->Printf
152 #define SkinGetCmdLine                   SkinAPI->GetCommandLine
153 #define SkinNotify(op, state, ctx, sz)   SkinAPI->Msg(op, state, ctx, sz, NULL, 0)
154 #define SkinAsk(op, state, ctx, def)     SkinAPI->Msg(op, state, ctx, sizeof(ctx), NULL, 0)
155 
156 #else
157 
158 #define SkinLoad(path)    {;}
159 
160 #if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
161   #define SkinPrintf(x)                    {;}
162 /*VOID
163 inline
164 SkinPrintf(
165     PCHAR Message,
166     ...
167     )
168 {
169     //do nothing
170     return;
171 }*/
172 #else // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
173   #define SkinPrintf                       printf
174 #endif
175 
176 #define SkinGetCmdLine                   GetCommandLineW
177 #define SkinNotify(op, state, ctx)       {;}
178 #define SkinAsk(op, state, ctx, def)     (def)
179 
180 #endif // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
181 
182 #if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
183 
184   #if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
185     #define UserPrint(x) PrintDbgConsole x
186   #else
187     #define UserPrint(x) {;}
188   #endif // PRINT_TO_DBG_LOG
189 
190 #else // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
191 
192   #if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
193 
194     #define UserPrint(x) \
195     {                    \
196      SkinPrintf x ;          \
197      PrintDbgConsole x ; \
198     }
199 
200   #else // PRINT_TO_DBG_LOG
201 
202     #define UserPrint(x) \
203     {                    \
204      SkinPrintf x ;          \
205     }
206 
207   #endif // PRINT_TO_DBG_LOG
208 
209 #endif // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
210 
211 #if defined(DBG) || defined(PRINT_ALWAYS)
212 
213   #define DbgPrint SkinPrintf
214 
215   #ifdef KdPrint
216     #undef KdPrint
217   #endif
218 
219   #if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
220     #ifdef PRINT_TO_DBG_LOG
221       #define KdPrint(x) PrintDbgConsole x;
222     #else
223       #define KdPrint(x) {;}
224     #endif
225   #else
226 
227     #if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
228       #define KdPrint(x) \
229       {                    \
230        SkinPrintf x ;          \
231        PrintDbgConsole x ; \
232       }
233     #else
234       #define KdPrint(x) \
235       {                    \
236        SkinPrintf x ;          \
237       }
238     #endif
239   #endif
240 
241   #ifdef USE_MM_PRINT
242     #define MmPrint(_x_) DbgPrint _x_
243   #else
244     #define MmPrint(_x_) {NOTHING;}
245   #endif //USE_MM_PRINT
246 
247   #ifdef USE_TIME_PRINT
248     extern ULONG UdfTimeStamp;
249     #define TmPrint(_x_) {UdfTimeStamp++;KdPrint(("TM:%d: ",UdfTimeStamp));KdPrint(_x_);}
250   #else
251     #define TmPrint KdPrint
252   #endif //USE_MM_PRINT
253 
254   #ifdef USE_PERF_PRINT
255     #define PerfPrint(_x_) DbgPrint _x_
256   #else
257     #define PerfPrint(_x_) {NOTHING;}
258   #endif //USE_MM_PRINT
259 
260 #if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
261   #ifdef USE_AD_PRINT
262     #undef USE_AD_PRINT
263   #endif
264   #ifdef USE_TH_PRINT
265     #undef USE_TH_PRINT
266   #endif
267 #endif
268 
269   #ifdef USE_AD_PRINT
270     #define AdPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;}
271   #else
272     #define AdPrint(_x_) {NOTHING;}
273   #endif
274 
275   #ifdef USE_TH_PRINT
276     #define ThPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;}
277   #else
278     #define ThPrint(_x_) {NOTHING;}
279   #endif
280 
281   #ifdef USE_DUMP_EXT
282     #define ExtPrint(_x_) DbgPrint _x_
283   #else
284     #define ExtPrint(_x_) {NOTHING;}
285   #endif //USE_MM_PRINT
286 
287 #else
288   #define KdPrint(x)     {NOTHING;}
289   #define MmPrint(_x_)   {NOTHING;}
290   #define TmPrint(_x_)   {NOTHING;}
291   #define PerfPrint(_x_) {NOTHING;}
292   #define AdPrint(_x_)   {NOTHING;}
293   #define ThPrint(_x_)   {NOTHING;}
294   #define ExtPrint(_x_)  {NOTHING;}
295 #endif
296 
297 #define DbgTouch(a)
298 
299 #ifndef NT_NATIVE_MODE
300 #include "assert.h"
301 
302 #define ASSERT(_x_)   assert(_x_)
303 #define UDFTouch(a)
304 
305 #endif //NT_NATIVE_MODE
306 
307 #define NonPagedPool            0
308 #define PagedPool               1
309 //#define NonPagedPoolMustSucceed 2
310 #define NonPagedPoolCacheAligned 4
311 
312 #define KdDump(a,b)                         \
313 if((a)!=NULL) {                             \
314     ULONG i;                                \
315     for(i=0; i<(b); i++) {                  \
316         ULONG c;                            \
317         c = (ULONG)(*(((PUCHAR)(a))+i));    \
318         KdPrint(("%2.2x ",c));              \
319         if ((i & 0x0f) == 0x0f) KdPrint(("\n"));   \
320     }                                       \
321     KdPrint(("\n"));                        \
322 }
323 
324 //mem ot
325 //#define ExAllocatePool(hernya,size) MyAllocatePool(size)
326 //#define ExFreePool(size) MyFreePool((PCHAR)(size))
327 //#define SystemAllocatePool(hernya,size) GlobalAlloc(GMEM_DISCARDABLE, size);
328 //#define SystemFreePool(addr) GlobalFree((PVOID)(addr))
329 #define DbgMoveMemory     RtlMoveMemory
330 #define DbgCompareMemory  RtlCompareMemory
331 #define DbgCopyMemory     RtlCopyMemory
332 #define DbgAllocatePool   ExAllocatePool
333 #define DbgAllocatePoolWithTag(a,b,c)   ExAllocatePool(a,b)
334 #define DbgFreePool       ExFreePool
335 
336 #ifdef NT_NATIVE_MODE
337 /*
338 #define GlobalAlloc(foo, size)  MyGlobalAlloc( size );
339 #define GlobalFree(ptr)         MyGlobalFree( ptr );
340 
341 extern "C"
342 PVOID MyGlobalAlloc(ULONG Size);
343 
344 extern "C"
345 VOID  MyGlobalFree(PVOID Addr);
346 */
347 #endif
348 
349 #if !defined(KERNEL_MODE_MM_BEHAVIOR) && !defined(USE_THREAD_HEAPS)
350 #define ExAllocatePoolWithTag(hernya,size,tag) GlobalAlloc(GMEM_DISCARDABLE, (size))
351 #define ExAllocatePool(hernya,size) GlobalAlloc(GMEM_DISCARDABLE, (size))
352 #define ExFreePool(addr) GlobalFree((PVOID)(addr))
353 #endif
354 
355 #if defined(KERNEL_MODE_MM_BEHAVIOR) || defined(USE_THREAD_HEAPS)
356 #define ExAllocatePoolWithTag(MemoryType,size,tag) ExAllocatePool((MemoryType), (size))
357 
358 extern "C"
359 PVOID ExAllocatePool(ULONG MemoryType, ULONG Size);
360 
361 extern "C"
362 VOID  ExFreePool(PVOID Addr);
363 #endif //KERNEL_MODE_MM_BEHAVIOR || USE_THREAD_HEAPS
364 
365 #ifndef NT_NATIVE_MODE
366 
367 //string ot
368 typedef struct _UNICODE_STRING {
369     USHORT Length;
370     USHORT MaximumLength;
371     PWSTR  Buffer;
372 } UNICODE_STRING;
373 typedef UNICODE_STRING *PUNICODE_STRING;
374 
375 typedef struct _ANSI_STRING {
376     USHORT Length;
377     USHORT MaximumLength;
378     PSTR   Buffer;
379 } ANSI_STRING;
380 typedef ANSI_STRING *PANSI_STRING;
381 
382 #endif //NT_NATIVE_MODE
383 
384 #define PtrOffset(BASE,OFFSET) ((ULONG)((ULONG)(OFFSET) - (ULONG)(BASE)))
385 
386 // Device object ot
387 
388 #ifndef DO_UNLOAD_PENDING
389 // Define Device Object (DO) flags
390 //
391 
392 #define DO_UNLOAD_PENDING               0x00000001
393 #define DO_VERIFY_VOLUME                0x00000002
394 #define DO_BUFFERED_IO                  0x00000004
395 #define DO_EXCLUSIVE                    0x00000008
396 #define DO_DIRECT_IO                    0x00000010
397 #define DO_MAP_IO_BUFFER                0x00000020
398 #define DO_DEVICE_HAS_NAME              0x00000040
399 #define DO_DEVICE_INITIALIZING          0x00000080
400 #define DO_SYSTEM_BOOT_PARTITION        0x00000100
401 #define DO_LONG_TERM_REQUESTS           0x00000200
402 #define DO_NEVER_LAST_DEVICE            0x00000400
403 #define DO_SHUTDOWN_REGISTERED          0x00000800
404 
405 #endif //DO_UNLOAD_PENDING
406 
407 #ifdef NT_NATIVE_MODE
408 #define _DEVICE_OBJECT _MY_DEVICE_OBJECT
409 #define DEVICE_OBJECT  MY_DEVICE_OBJECT
410 #define PDEVICE_OBJECT PMY_DEVICE_OBJECT
411 #endif //NT_NATIVE_MODE
412 
413 typedef struct _DEVICE_OBJECT {
414 
415 #ifndef LIBUDF
416 
417     HANDLE h;
418     PVOID  DeviceExtension;
419     ULONG  Flags;
420     ULONG  AlignmentRequirement;
421     UCHAR  StackSize;
422 
423 #endif // LIBUDF
424 
425 
426 #ifdef LIBUDFFMT
427 
428     struct _UDF_FMT_PARAMETERS* cbio;
429     PVOID  lpContext;
430 
431 #else
432 #ifdef LIBUDF
433     PVOID  lpContext;
434 #endif // LIBUDF
435 #endif // LIBUDFFMT
436 
437 } DEVICE_OBJECT, *PDEVICE_OBJECT;
438 
439 #ifndef CDRW_W32
440 /*
441 typedef ULONG DEVICE_OBJECT;
442 typedef ULONG PDEVICE_OBJECT;
443 */
444 #define INVALID_PACKET 0x01
445 
446 typedef struct _PACKET {
447     // Node Identifier
448 //  UDFIdentifier               NodeIdentifier;
449     // Pointer to the buffer (in non-paged pool)
450     PCHAR           buffer;
451     // Offset, from which this data was read
452     LARGE_INTEGER   offset;
453     // Flags
454     UCHAR           flags;
455 } PACKET, *PPACKET;
456 
457 #define UDFInitPacket(x) STATUS_SUCCESS
458 #endif //CDRW_W32
459 
460 #define try_return(S)   { S; goto try_exit; }
461 #define NOTHING
462 
463 #define FlagOn(x,f) ((x) & (f))
464 
465 #define RtlCompareMemory(s1,s2,l)  MyRtlCompareMemory(s1,s2,l)
466 // Structure ot
467 extern "C"
468 ULONG
469 MyRtlCompareMemory(
470     PVOID s1,
471     PVOID s2,
472     ULONG len
473     );
474 //#define RtlCompareMemory(d1,d2,l)   (ULONG)(memcmp (d1,d2,l))
475 
476 #define KeSetEvent(pEvt, foo, foo2)          {NOTHING;}
477 #define KeInitializeEvent(pEvt, foo, foo2)   {NOTHING;}
478 #define KeWaitForSingleObject(pEvt, foo, a, b, c)     {NOTHING;}
479 #define DbgWaitForSingleObject(o, to)   KeWaitForSingleObject(o, Executive, KernelMode, FALSE, to);
480 //#define DbgWaitForSingleObject   KeWaitForSingleObject
481 #ifdef NT_NATIVE_MODE
482 #define KeDelayExecutionThread(mode, foo, t)  { NtDelayExecution(false, t); }
483 #else //NT_NATIVE_MODE
484 #define KeDelayExecutionThread(mode, foo, t) { Sleep( abs((LONG)(((t)->QuadPart)/10000)) ); }
485 #endif //NT_NATIVE_MODE
486 
487 /*#define RtlCompareUnicodeString(s1,s2,cs) \
488  (((s1)->Length == (s2)->Length) && \
489   (RtlCompareMemory(s1,s2,(s1)->Length)))
490 */
491 #ifndef CDRW_W32
492 #ifdef _X86_
493 
494 // This is an illegal use of INT3
495 #define UDFBreakPoint() __asm int 3
496 #else // _X86_
497 
498 #define UDFBreakPoint() DbgBreakPoint()
499 #endif // _X86_
500 
501 #ifdef BRUTE
502 #define BrutePoint() UDFBreakPoint()
503 #else
504 #define BrutePoint() {}
505 #endif // BRUTE
506 
507 #ifdef VALIDATE_STRUCTURES
508 #define ValidateFileInfo(fi)            \
509 {    /* validate FileInfo */            \
510     if((fi)->IntegrityTag) {            \
511         KdPrint(("UDF: ERROR! Using deallocated structure !!!\n"));\
512         /*BrutePoint();*/                   \
513     }                                   \
514 }
515 #else
516 #define ValidateFileInfo(fi)  {}
517 #endif
518 
519 #else //CDRW_W32
520 
521 #ifdef BRUTE
522 #ifdef _X86_
523 
524 // This is an illegal use of INT3
525 #define BrutePoint() __asm int 3
526 #else // _X86_
527 
528 #define BrutePoint() DbgBreakPoint()
529 #endif // _X86_
530 #else
531 #define BrutePoint() {}
532 #endif // BRUTE
533 
534 #endif //CDRW_W32
535 
536 #ifndef NT_NATIVE_MODE
537 
538 extern "C"
539 ULONG
540 RtlCompareUnicodeString(
541     PUNICODE_STRING s1,
542     PUNICODE_STRING s2,
543     BOOLEAN UpCase);
544 
545 extern "C"
546 NTSTATUS
547 RtlUpcaseUnicodeString(
548     PUNICODE_STRING dst,
549     PUNICODE_STRING src,
550     BOOLEAN Alloc
551     );
552 
553 extern "C"
554 NTSTATUS
555 RtlAppendUnicodeToString(
556     IN PUNICODE_STRING Str1,
557     IN PWSTR Str2
558     );
559 
560 #endif //NT_NATIVE_MODE
561 
562 extern "C"
563 NTSTATUS
564 MyInitUnicodeString(
565     IN PUNICODE_STRING Str1,
566     IN PCWSTR Str2
567     );
568 
569 #ifndef NT_NATIVE_MODE
570 #define KeQuerySystemTime(t)     GetSystemTimeAsFileTime((LPFILETIME)(t));
571 
572 typedef struct _FILE_BOTH_DIR_INFORMATION {
573     ULONG           NextEntryOffset;
574     ULONG           FileIndex;
575     LARGE_INTEGER   CreationTime;
576     LARGE_INTEGER   LastAccessTime;
577     LARGE_INTEGER   LastWriteTime;
578     LARGE_INTEGER   ChangeTime;
579     LARGE_INTEGER   EndOfFile;
580     LARGE_INTEGER   AllocationSize;
581     ULONG           FileAttributes;
582     ULONG           FileNameLength;
583     ULONG           EaSize;
584     CCHAR           ShortNameLength;
585     WCHAR           ShortName[12];
586     WCHAR           FileName[1];
587 } FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
588 
589 #endif //NT_NATIVE_MODE
590 
591 typedef UCHAR KIRQL;
592 typedef KIRQL *PKIRQL;
593 
594 typedef ULONG ERESOURCE;
595 typedef ERESOURCE *PERESOURCE;
596 
597 #define KeRaiseIrql(irql, oldIrql)                    \
598 {                                                     \
599     *oldIrql = 0;                                     \
600 }
601 
602 #define KeLowerIrql(oldIrql)  {;}
603 
604 #define KeInitializeSpinLock(sl)                    \
605 {                                                     \
606   *(sl) = 0;                                          \
607 }
608 
609 #define KeAcquireSpinLock(sl,irql)                    \
610 {                                                     \
611     ULONG isLocked = TRUE;                            \
612     while(isLocked) AcquireXLock(*(sl), isLocked, TRUE);\
613 }
614 
615 #define ExAcquireResourceExclusiveLite(res, wait)     \
616 {                                                     \
617     ULONG isLocked = TRUE;                            \
618     while(isLocked) AcquireXLock(*(res), isLocked, TRUE);\
619 }
620 
621 #define ExAcquireResourceSharedLite(res, wait)        \
622 {                                                     \
623     ULONG isLocked = TRUE;                            \
624     while(isLocked) AcquireXLock(*(res), isLocked, TRUE);\
625 }
626 
627 #define KeReleaseSpinLock(sl,irql)                    \
628 {                                                     \
629     ULONG isLocked;                                   \
630     AcquireXLock(*(sl), isLocked, FALSE);             \
631 }
632 
633 #define ExGetCurrentResourceThread()  0
634 
635 #define ExReleaseResourceForThreadLite(res, thrdID)   \
636 {                                                     \
637     ULONG isLocked;                                   \
638     AcquireXLock(*(res), isLocked, FALSE);            \
639 }
640 
641 NTSTATUS inline ExInitializeResourceLite(PULONG res)
642 {
643    *(res) = 0;
644    return STATUS_SUCCESS;
645 }
646 
647 #define ExDeleteResourceLite(res)                     \
648 {                                                     \
649    *(res) = 0;                                        \
650 }
651 
652 #define ExConvertExclusiveToSharedLite(res) {/* do nothing */}
653 
654 #ifndef CDRW_W32
655 
656 #define UDFAcquireResourceExclusive(Resource,CanWait)  \
657     ExAcquireResourceExclusiveLite((Resource),(CanWait))
658 #define UDFAcquireResourceShared(Resource,CanWait) \
659     ExAcquireResourceSharedLite((Resource),(CanWait))
660 // a convenient macro (must be invoked in the context of the thread that acquired the resource)
661 #define UDFReleaseResource(Resource)    \
662     ExReleaseResourceForThreadLite((Resource), ExGetCurrentResourceThread())
663 #define UDFDeleteResource(Resource)    \
664     ExDeleteResourceLite((Resource))
665 #define UDFConvertExclusiveToSharedLite(Resource) \
666     ExConvertExclusiveToSharedLite((Resource))
667 #define UDFInitializeResourceLite(Resource) \
668     ExInitializeResourceLite((Resource))
669 #define UDFAcquireSharedStarveExclusive(Resource,CanWait) \
670     ExAcquireSharedStarveExclusive((Resource),(CanWait))
671 #define UDFAcquireSharedWaitForExclusive(Resource,CanWait) \
672     ExAcquireSharedWaitForExclusive((Resource),(CanWait))
673 //#define UDFDebugAcquireResourceExclusiveLite(a,b,c,d) ExAcquireResourceExclusiveLite(a,b)
674 
675 #define UDFInterlockedIncrement(addr) \
676     ((*addr)++)
677 #define UDFInterlockedDecrement(addr) \
678     ((*addr)--)
679 int
680 __inline
681 UDFInterlockedExchangeAdd(PLONG addr, LONG i) {
682     LONG Old = (*addr);
683     (*addr) += i;
684     return Old;
685 }
686 
687 #endif //CDRW_W32
688 
689 //
690 // Interrupt Request Level definitions
691 //
692 
693 #define PASSIVE_LEVEL 0             // Passive release level
694 #define LOW_LEVEL 0                 // Lowest interrupt level
695 #define APC_LEVEL 1                 // APC interrupt level
696 #define DISPATCH_LEVEL 2            // Dispatcher level
697 
698 #define PROFILE_LEVEL 27            // timer used for profiling.
699 #define CLOCK1_LEVEL 28             // Interval clock 1 level - Not used on x86
700 #define CLOCK2_LEVEL 28             // Interval clock 2 level
701 #define IPI_LEVEL 29                // Interprocessor interrupt level
702 #define POWER_LEVEL 30              // Power failure level
703 #define HIGH_LEVEL 31               // Highest interrupt level
704 #define SYNCH_LEVEL (IPI_LEVEL-1)   // synchronization level
705 
706 #define KeGetCurrentIrql()      PASSIVE_LEVEL
707 
708 #ifndef NT_NATIVE_MODE
709 
710 typedef struct _TIME_FIELDS {
711     USHORT Year;        // range [1601...]
712     USHORT Month;       // range [1..12]
713     USHORT Day;         // range [1..31]
714     USHORT Hour;        // range [0..23]
715     USHORT Minute;      // range [0..59]
716     USHORT Second;      // range [0..59]
717     USHORT Milliseconds;// range [0..999]
718     USHORT Weekday;     // range [0..6] == [Sunday..Saturday]
719 } TIME_FIELDS;
720 typedef TIME_FIELDS *PTIME_FIELDS;
721 
722 //#define RtlTimeFieldsToTime(a,b)     TRUE
723 BOOLEAN
724 RtlTimeFieldsToTime(
725     IN PTIME_FIELDS TimeFields,
726     IN PLARGE_INTEGER Time
727     );
728 
729 #define ExSystemTimeToLocalTime(SysTime, LocTime)     FileTimeToLocalFileTime((PFILETIME)(SysTime), (PFILETIME)(LocTime))
730 
731 //#define RtlTimeToTimeFields(a,b) {}
732 BOOLEAN
733 RtlTimeToTimeFields(
734     IN PLARGE_INTEGER Time,
735     IN PTIME_FIELDS TimeFields
736     );
737 
738 #define ExLocalTimeToSystemTime(LocTime, SysTime)     LocalFileTimeToFileTime((PFILETIME)(LocTime), (PFILETIME)(SysTime))
739 
740 #endif //NT_NATIVE_MODE
741 
742 #ifndef CDRW_W32
743 
744 typedef struct _FSRTL_COMMON_FCB_HEADER {
745     SHORT           NodeTypeCode;
746     SHORT           NodeByteSize;
747     UCHAR           Flags;
748     UCHAR           IsFastIoPossible;
749 #if (_WIN32_WINNT >= 0x0400)
750     UCHAR           Flags2;
751     UCHAR           Reserved;
752 #endif // (_WIN32_WINNT >= 0x0400)
753     PERESOURCE      Resource;
754     PERESOURCE      PagingIoResource;
755     LARGE_INTEGER   AllocationSize;
756     LARGE_INTEGER   FileSize;
757     LARGE_INTEGER   ValidDataLength;
758 } FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
759 
760 typedef struct _SECTION_OBJECT_POINTERS {
761     PVOID DataSectionObject;
762     PVOID SharedCacheMap;
763     PVOID ImageSectionObject;
764 } SECTION_OBJECT_POINTERS;
765 typedef SECTION_OBJECT_POINTERS *PSECTION_OBJECT_POINTERS;
766 
767 
768 extern NTSTATUS UDFPhReadSynchronous(
769                    PDEVICE_OBJECT      DeviceObject,
770                    PVOID           Buffer,
771                    ULONG           Length,
772                    LONGLONG        Offset,
773                    PULONG          ReadBytes,
774                    ULONG           Flags);
775 
776 extern NTSTATUS UDFPhWriteSynchronous(
777                    PDEVICE_OBJECT  DeviceObject,   // the physical device object
778                    PVOID           Buffer,
779                    ULONG           Length,
780                    LONGLONG        Offset,
781                    PULONG          WrittenBytes,
782                    ULONG           Flags);
783 
784 #if 0
785 extern NTSTATUS
786 UDFPhWriteVerifySynchronous(
787     PDEVICE_OBJECT  DeviceObject,   // the physical device object
788     PVOID           Buffer,
789     ULONG           Length,
790     LONGLONG        Offset,
791     PULONG          WrittenBytes,
792     ULONG           Flags
793     );
794 #endif
795 
796 #define UDFPhWriteVerifySynchronous   UDFPhWriteSynchronous
797 
798 extern NTSTATUS UDFPhSendIOCTL(
799     IN ULONG IoControlCode,
800     IN PDEVICE_OBJECT DeviceObject,
801     IN PVOID InputBuffer ,
802     IN ULONG InputBufferLength,
803     OUT PVOID OutputBuffer ,
804     IN ULONG OutputBufferLength,
805     IN BOOLEAN OverrideVerify,
806     OUT PVOID Iosb OPTIONAL);
807 
808 #endif //CDRW_W32
809 
810 VOID set_image_size(HANDLE h,
811 //                    ULONG LBA);
812                     int64  len);
813 
814 #ifdef UDF_FORMAT_MEDIA
815 struct _UDFVolumeControlBlock;
816 #endif
817 
818 #ifndef UDF_FORMAT_MEDIA
819 ULONG write(
820             HANDLE h,
821             PCHAR buff,
822             ULONG len);
823 #endif
824 
825 extern "C"
826 HANDLE
827 my_open(
828 #ifndef CDRW_W32
829     struct _UDFVolumeControlBlock* Vcb,
830 #endif //CDRW_W32
831     PWCHAR fn);
832 
833 #ifdef UDF_FORMAT_MEDIA
834 struct _UDFFmtState;
835 #endif //UDF_FORMAT_MEDIA
836 
837 extern
838 void
839 my_exit(
840 #ifdef UDF_FORMAT_MEDIA
841     struct _UDFFmtState* fms,
842 #endif //UDF_FORMAT_MEDIA
843     int rc
844     );
845 
846 #ifndef CDRW_W32
847 uint64 udf_lseek64(HANDLE fd, uint64 offset, int whence);
848 #endif //CDRW_W32
849 
850 #ifdef LIBUDFFMT
851 BOOLEAN
852 udf_get_sizes(
853     IN PDEVICE_OBJECT DeviceObject,
854     IN ULONG* blocks
855     );
856 #endif //LIBUDFFMT
857 
858 int64
859 get_file_size(
860     HANDLE h
861     );
862 
863 int64
864 set_file_pointer(
865     HANDLE h,
866     int64 sz
867     );
868 
869 #ifndef NT_NATIVE_MODE
870 typedef struct _IO_STATUS_BLOCK {
871     ULONG Status;
872     ULONG Information;
873 } IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
874 #endif //NT_NATIVE_MODE
875 
876 
877 #ifndef UDF_FORMAT_MEDIA
878 extern ULONG   LockMode;
879 extern BOOLEAN open_as_device;
880 extern BOOLEAN opt_invalidate_volume;
881 #endif //UDF_FORMAT_MEDIA
882 
883 extern "C"
884 ULONG
885 MyLockVolume(
886     HANDLE h,
887     ULONG* pLockMode // OUT
888     );
889 
890 extern "C"
891 ULONG
892 MyUnlockVolume(
893     HANDLE h,
894     ULONG* pLockMode // IN
895     );
896 
897 #ifndef CDRW_W32
898 ULONG
899 UDFGetDevType(PDEVICE_OBJECT DeviceObject);
900 #endif //CDRW_W32
901 
902 #ifndef INVALID_HANDLE_VALUE
903 #define INVALID_HANDLE_VALUE    ((HANDLE)(-1))
904 #endif
905 
906 #ifndef ANSI_DOS_STAR
907 
908 #define ANSI_DOS_STAR   ('<')
909 #define ANSI_DOS_QM     ('>')
910 #define ANSI_DOS_DOT    ('"')
911 
912 #define DOS_STAR        (L'<')
913 #define DOS_QM          (L'>')
914 #define DOS_DOT         (L'"')
915 
916 #endif //ANSI_DOS_STAR
917 
918 extern "C"
919 BOOLEAN
920 ProbeMemory(
921     PVOID   MemPtr,
922     ULONG   Length,
923     BOOLEAN ForWrite
924     );
925 
926 #ifdef NT_NATIVE_MODE
927 #include "env_spec_nt.h"
928 #endif //NT_NATIVE_MODE
929 
930 #ifndef InitializeListHead
931 
932 //
933 //  Doubly-linked list manipulation routines.  Implemented as macros
934 //  but logically these are procedures.
935 //
936 
937 //
938 //  VOID
939 //  InitializeListHead(
940 //      PLIST_ENTRY ListHead
941 //      );
942 //
943 
944 #define InitializeListHead(ListHead) (\
945     (ListHead)->Flink = (ListHead)->Blink = (ListHead))
946 
947 //
948 //  BOOLEAN
949 //  IsListEmpty(
950 //      PLIST_ENTRY ListHead
951 //      );
952 //
953 
954 #define IsListEmpty(ListHead) \
955     ((ListHead)->Flink == (ListHead))
956 
957 //
958 //  PLIST_ENTRY
959 //  RemoveHeadList(
960 //      PLIST_ENTRY ListHead
961 //      );
962 //
963 
964 #define RemoveHeadList(ListHead) \
965     (ListHead)->Flink;\
966     {RemoveEntryList((ListHead)->Flink)}
967 
968 //
969 //  PLIST_ENTRY
970 //  RemoveTailList(
971 //      PLIST_ENTRY ListHead
972 //      );
973 //
974 
975 #define RemoveTailList(ListHead) \
976     (ListHead)->Blink;\
977     {RemoveEntryList((ListHead)->Blink)}
978 
979 //
980 //  VOID
981 //  RemoveEntryList(
982 //      PLIST_ENTRY Entry
983 //      );
984 //
985 
986 #define RemoveEntryList(Entry) {\
987     PLIST_ENTRY _EX_Blink;\
988     PLIST_ENTRY _EX_Flink;\
989     _EX_Flink = (Entry)->Flink;\
990     _EX_Blink = (Entry)->Blink;\
991     _EX_Blink->Flink = _EX_Flink;\
992     _EX_Flink->Blink = _EX_Blink;\
993     }
994 
995 //
996 //  VOID
997 //  InsertTailList(
998 //      PLIST_ENTRY ListHead,
999 //      PLIST_ENTRY Entry
1000 //      );
1001 //
1002 
1003 #define InsertTailList(ListHead,Entry) {\
1004     PLIST_ENTRY _EX_Blink;\
1005     PLIST_ENTRY _EX_ListHead;\
1006     _EX_ListHead = (ListHead);\
1007     _EX_Blink = _EX_ListHead->Blink;\
1008     (Entry)->Flink = _EX_ListHead;\
1009     (Entry)->Blink = _EX_Blink;\
1010     _EX_Blink->Flink = (Entry);\
1011     _EX_ListHead->Blink = (Entry);\
1012     }
1013 
1014 //
1015 //  VOID
1016 //  InsertHeadList(
1017 //      PLIST_ENTRY ListHead,
1018 //      PLIST_ENTRY Entry
1019 //      );
1020 //
1021 
1022 #define InsertHeadList(ListHead,Entry) {\
1023     PLIST_ENTRY _EX_Flink;\
1024     PLIST_ENTRY _EX_ListHead;\
1025     _EX_ListHead = (ListHead);\
1026     _EX_Flink = _EX_ListHead->Flink;\
1027     (Entry)->Flink = _EX_Flink;\
1028     (Entry)->Blink = _EX_ListHead;\
1029     _EX_Flink->Blink = (Entry);\
1030     _EX_ListHead->Flink = (Entry);\
1031     }
1032 
1033 #endif //InitializeListHead
1034 
1035 #endif  // __ENV_SPEC_W32__H_
1036