reactos/drivers/filesystems/udfs/Include/env_spec_w32.h

1036 lines
25 KiB
C

////////////////////////////////////////////////////////////////////
// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
// All rights reserved
// This file was released under the GPLv2 on June 2015.
////////////////////////////////////////////////////////////////////
/*************************************************************************
*
* File: env_spec_w32.h
*
* Module: User-mode applications (User mode execution only)
*
* Description:
*
*
* Author: Alter
*
*************************************************************************/
#ifndef __ENV_SPEC_W32__H_
#define __ENV_SPEC_W32__H_
#ifdef NT_NATIVE_MODE
//#include "ntddk.h" // include this for its native functions and defn's
#include "nt_native.h"
#else //NT_NATIVE_MODE
#include <windows.h>
#endif //NT_NATIVE_MODE
#include "platform.h"
//#ifndef WITHOUT_FORMATTER
#include "udferr_usr.h"
//#endif WITHOUT_FORMATTER
#ifndef NT_NATIVE_MODE
#ifdef ASSERT
#undef ASSERT
#define ASSERT(a) if(!(a)) {__asm int 3;}
#endif
#endif //NT_NATIVE_MODE
#ifndef MAXIMUM_FILENAME_LENGTH
#define MAXIMUM_FILENAME_LENGTH MAX_PATH
#endif //MAXIMUM_FILENAME_LENGTH
#ifndef PAGE_SHIFT
#define PAGE_SHIFT 12
#endif //PAGE_SHIFT
#ifndef PAGE_SIZE
#define PAGE_SIZE (ULONG)0x1000
#endif //PAGE_SIZE
#ifndef PHYSICAL_ADDRESS
#define PHYSICAL_ADDRESS LARGE_INTEGER
#endif //PHYSICAL_ADDRESS
#define OS_SUCCESS(a) NT_SUCCESS(a)
#define OSSTATUS NTSTATUS
#if defined UDF_DBG || defined DEBUG
#define DBG
#ifndef CDRW_W32
#define UDF_DBG
#endif //CDRW_W32
#endif
#define ERESEOURCE ULONG
#define PERESEOURCE PULONG
#define KEVENT ULONG
#define PKEVENT PULONG
typedef ULONG KSPIN_LOCK; // winnt ntndis
typedef KSPIN_LOCK *PKSPIN_LOCK;
#ifndef NT_NATIVE_MODE
// Status ot
#define NTSTATUS LONG
#define NT_SUCCESS(x) ( (NTSTATUS)(x)>=0 )
#define PsGetCurrentThread() GetCurrentThreadId()
#define PsGetVersion(a,b,c,d) { \
OSVERSIONINFO OsVer; \
OsVer.dwOSVersionInfoSize = sizeof(OsVer); \
GetVersionEx(&OsVer); \
if(a) (*(a)) = OsVer.dwMajorVersion; \
if(b) (*(b)) = OsVer.dwMinorVersion; \
if(c) (*(c)) = OsVer.dwBuildNumber; \
if(d) (d)->Buffer = L""; \
if(d) (d)->Length = 0; \
if(d) (d)->MaximumLength = 0; \
}
extern "C"
VOID
PrintDbgConsole(
PCHAR DebugMessage,
...
);
#else //NT_NATIVE_MODE
#define HINSTANCE HANDLE
#endif //NT_NATIVE_MODE
typedef
int (*PSKIN_INIT) (
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
int nCmdShow // show state
);
typedef
int (*PSKIN_PRINTF) (
const char* Message,
...
);
typedef
PWCHAR (__stdcall *PSKIN_GETCMDLINE) (
VOID
);
typedef
ULONG (__stdcall *PSKIN_MSG) (
ULONG MsgId,
ULONG MsgSubId,
PVOID DataIn,
ULONG DataInLen,
PVOID DataOut,
ULONG DataInOut
);
typedef struct _SKIN_API {
PSKIN_INIT Init;
PSKIN_PRINTF Printf;
PSKIN_GETCMDLINE GetCommandLine;
PSKIN_MSG Msg;
} SKIN_API, *PSKIN_API;
#ifdef USE_SKIN_MODEL
extern "C" PSKIN_API SkinAPI;
extern PSKIN_API SkinLoad(
PWCHAR path,
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
int nCmdShow // show state
);
#define SkinPrintf SkinAPI->Printf
#define SkinGetCmdLine SkinAPI->GetCommandLine
#define SkinNotify(op, state, ctx, sz) SkinAPI->Msg(op, state, ctx, sz, NULL, 0)
#define SkinAsk(op, state, ctx, def) SkinAPI->Msg(op, state, ctx, sizeof(ctx), NULL, 0)
#else
#define SkinLoad(path) {;}
#if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#define SkinPrintf(x) {;}
/*VOID
inline
SkinPrintf(
PCHAR Message,
...
)
{
//do nothing
return;
}*/
#else // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#define SkinPrintf printf
#endif
#define SkinGetCmdLine GetCommandLineW
#define SkinNotify(op, state, ctx) {;}
#define SkinAsk(op, state, ctx, def) (def)
#endif // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
#define UserPrint(x) PrintDbgConsole x
#else
#define UserPrint(x) {;}
#endif // PRINT_TO_DBG_LOG
#else // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
#define UserPrint(x) \
{ \
SkinPrintf x ; \
PrintDbgConsole x ; \
}
#else // PRINT_TO_DBG_LOG
#define UserPrint(x) \
{ \
SkinPrintf x ; \
}
#endif // PRINT_TO_DBG_LOG
#endif // defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#if defined(DBG) || defined(PRINT_ALWAYS)
#define DbgPrint SkinPrintf
#ifdef KdPrint
#undef KdPrint
#endif
#if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#ifdef PRINT_TO_DBG_LOG
#define KdPrint(x) PrintDbgConsole x;
#else
#define KdPrint(x) {;}
#endif
#else
#if defined(PRINT_TO_DBG_LOG) || defined(PRINT_ALWAYS)
#define KdPrint(x) \
{ \
SkinPrintf x ; \
PrintDbgConsole x ; \
}
#else
#define KdPrint(x) \
{ \
SkinPrintf x ; \
}
#endif
#endif
#ifdef USE_MM_PRINT
#define MmPrint(_x_) DbgPrint _x_
#else
#define MmPrint(_x_) {NOTHING;}
#endif //USE_MM_PRINT
#ifdef USE_TIME_PRINT
extern ULONG UdfTimeStamp;
#define TmPrint(_x_) {UdfTimeStamp++;KdPrint(("TM:%d: ",UdfTimeStamp));KdPrint(_x_);}
#else
#define TmPrint KdPrint
#endif //USE_MM_PRINT
#ifdef USE_PERF_PRINT
#define PerfPrint(_x_) DbgPrint _x_
#else
#define PerfPrint(_x_) {NOTHING;}
#endif //USE_MM_PRINT
#if defined(CDRW_W32) || defined(LIBUDFFMT) || defined(LIBUDF)
#ifdef USE_AD_PRINT
#undef USE_AD_PRINT
#endif
#ifdef USE_TH_PRINT
#undef USE_TH_PRINT
#endif
#endif
#ifdef USE_AD_PRINT
#define AdPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;}
#else
#define AdPrint(_x_) {NOTHING;}
#endif
#ifdef USE_TH_PRINT
#define ThPrint(_x_) {DbgPrint("Thrd:%x:",PsGetCurrentThread());DbgPrint _x_;}
#else
#define ThPrint(_x_) {NOTHING;}
#endif
#ifdef USE_DUMP_EXT
#define ExtPrint(_x_) DbgPrint _x_
#else
#define ExtPrint(_x_) {NOTHING;}
#endif //USE_MM_PRINT
#else
#define KdPrint(x) {NOTHING;}
#define MmPrint(_x_) {NOTHING;}
#define TmPrint(_x_) {NOTHING;}
#define PerfPrint(_x_) {NOTHING;}
#define AdPrint(_x_) {NOTHING;}
#define ThPrint(_x_) {NOTHING;}
#define ExtPrint(_x_) {NOTHING;}
#endif
#define DbgTouch(a)
#ifndef NT_NATIVE_MODE
#include "assert.h"
#define ASSERT(_x_) assert(_x_)
#define UDFTouch(a)
#endif //NT_NATIVE_MODE
#define NonPagedPool 0
#define PagedPool 1
//#define NonPagedPoolMustSucceed 2
#define NonPagedPoolCacheAligned 4
#define KdDump(a,b) \
if((a)!=NULL) { \
ULONG i; \
for(i=0; i<(b); i++) { \
ULONG c; \
c = (ULONG)(*(((PUCHAR)(a))+i)); \
KdPrint(("%2.2x ",c)); \
if ((i & 0x0f) == 0x0f) KdPrint(("\n")); \
} \
KdPrint(("\n")); \
}
//mem ot
//#define ExAllocatePool(hernya,size) MyAllocatePool(size)
//#define ExFreePool(size) MyFreePool((PCHAR)(size))
//#define SystemAllocatePool(hernya,size) GlobalAlloc(GMEM_DISCARDABLE, size);
//#define SystemFreePool(addr) GlobalFree((PVOID)(addr))
#define DbgMoveMemory RtlMoveMemory
#define DbgCompareMemory RtlCompareMemory
#define DbgCopyMemory RtlCopyMemory
#define DbgAllocatePool ExAllocatePool
#define DbgAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
#define DbgFreePool ExFreePool
#ifdef NT_NATIVE_MODE
/*
#define GlobalAlloc(foo, size) MyGlobalAlloc( size );
#define GlobalFree(ptr) MyGlobalFree( ptr );
extern "C"
PVOID MyGlobalAlloc(ULONG Size);
extern "C"
VOID MyGlobalFree(PVOID Addr);
*/
#endif
#if !defined(KERNEL_MODE_MM_BEHAVIOR) && !defined(USE_THREAD_HEAPS)
#define ExAllocatePoolWithTag(hernya,size,tag) GlobalAlloc(GMEM_DISCARDABLE, (size))
#define ExAllocatePool(hernya,size) GlobalAlloc(GMEM_DISCARDABLE, (size))
#define ExFreePool(addr) GlobalFree((PVOID)(addr))
#endif
#if defined(KERNEL_MODE_MM_BEHAVIOR) || defined(USE_THREAD_HEAPS)
#define ExAllocatePoolWithTag(MemoryType,size,tag) ExAllocatePool((MemoryType), (size))
extern "C"
PVOID ExAllocatePool(ULONG MemoryType, ULONG Size);
extern "C"
VOID ExFreePool(PVOID Addr);
#endif //KERNEL_MODE_MM_BEHAVIOR || USE_THREAD_HEAPS
#ifndef NT_NATIVE_MODE
//string ot
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING;
typedef struct _ANSI_STRING {
USHORT Length;
USHORT MaximumLength;
PSTR Buffer;
} ANSI_STRING;
typedef ANSI_STRING *PANSI_STRING;
#endif //NT_NATIVE_MODE
#define PtrOffset(BASE,OFFSET) ((ULONG)((ULONG)(OFFSET) - (ULONG)(BASE)))
// Device object ot
#ifndef DO_UNLOAD_PENDING
// Define Device Object (DO) flags
//
#define DO_UNLOAD_PENDING 0x00000001
#define DO_VERIFY_VOLUME 0x00000002
#define DO_BUFFERED_IO 0x00000004
#define DO_EXCLUSIVE 0x00000008
#define DO_DIRECT_IO 0x00000010
#define DO_MAP_IO_BUFFER 0x00000020
#define DO_DEVICE_HAS_NAME 0x00000040
#define DO_DEVICE_INITIALIZING 0x00000080
#define DO_SYSTEM_BOOT_PARTITION 0x00000100
#define DO_LONG_TERM_REQUESTS 0x00000200
#define DO_NEVER_LAST_DEVICE 0x00000400
#define DO_SHUTDOWN_REGISTERED 0x00000800
#endif //DO_UNLOAD_PENDING
#ifdef NT_NATIVE_MODE
#define _DEVICE_OBJECT _MY_DEVICE_OBJECT
#define DEVICE_OBJECT MY_DEVICE_OBJECT
#define PDEVICE_OBJECT PMY_DEVICE_OBJECT
#endif //NT_NATIVE_MODE
typedef struct _DEVICE_OBJECT {
#ifndef LIBUDF
HANDLE h;
PVOID DeviceExtension;
ULONG Flags;
ULONG AlignmentRequirement;
UCHAR StackSize;
#endif // LIBUDF
#ifdef LIBUDFFMT
struct _UDF_FMT_PARAMETERS* cbio;
PVOID lpContext;
#else
#ifdef LIBUDF
PVOID lpContext;
#endif // LIBUDF
#endif // LIBUDFFMT
} DEVICE_OBJECT, *PDEVICE_OBJECT;
#ifndef CDRW_W32
/*
typedef ULONG DEVICE_OBJECT;
typedef ULONG PDEVICE_OBJECT;
*/
#define INVALID_PACKET 0x01
typedef struct _PACKET {
// Node Identifier
// UDFIdentifier NodeIdentifier;
// Pointer to the buffer (in non-paged pool)
PCHAR buffer;
// Offset, from which this data was read
LARGE_INTEGER offset;
// Flags
UCHAR flags;
} PACKET, *PPACKET;
#define UDFInitPacket(x) STATUS_SUCCESS
#endif //CDRW_W32
#define try_return(S) { S; goto try_exit; }
#define NOTHING
#define FlagOn(x,f) ((x) & (f))
#define RtlCompareMemory(s1,s2,l) MyRtlCompareMemory(s1,s2,l)
// Structure ot
extern "C"
ULONG
MyRtlCompareMemory(
PVOID s1,
PVOID s2,
ULONG len
);
//#define RtlCompareMemory(d1,d2,l) (ULONG)(memcmp (d1,d2,l))
#define KeSetEvent(pEvt, foo, foo2) {NOTHING;}
#define KeInitializeEvent(pEvt, foo, foo2) {NOTHING;}
#define KeWaitForSingleObject(pEvt, foo, a, b, c) {NOTHING;}
#define DbgWaitForSingleObject(o, to) KeWaitForSingleObject(o, Executive, KernelMode, FALSE, to);
//#define DbgWaitForSingleObject KeWaitForSingleObject
#ifdef NT_NATIVE_MODE
#define KeDelayExecutionThread(mode, foo, t) { NtDelayExecution(false, t); }
#else //NT_NATIVE_MODE
#define KeDelayExecutionThread(mode, foo, t) { Sleep( abs((LONG)(((t)->QuadPart)/10000)) ); }
#endif //NT_NATIVE_MODE
/*#define RtlCompareUnicodeString(s1,s2,cs) \
(((s1)->Length == (s2)->Length) && \
(RtlCompareMemory(s1,s2,(s1)->Length)))
*/
#ifndef CDRW_W32
#ifdef _X86_
// This is an illegal use of INT3
#define UDFBreakPoint() __asm int 3
#else // _X86_
#define UDFBreakPoint() DbgBreakPoint()
#endif // _X86_
#ifdef BRUTE
#define BrutePoint() UDFBreakPoint()
#else
#define BrutePoint() {}
#endif // BRUTE
#ifdef VALIDATE_STRUCTURES
#define ValidateFileInfo(fi) \
{ /* validate FileInfo */ \
if((fi)->IntegrityTag) { \
KdPrint(("UDF: ERROR! Using deallocated structure !!!\n"));\
/*BrutePoint();*/ \
} \
}
#else
#define ValidateFileInfo(fi) {}
#endif
#else //CDRW_W32
#ifdef BRUTE
#ifdef _X86_
// This is an illegal use of INT3
#define BrutePoint() __asm int 3
#else // _X86_
#define BrutePoint() DbgBreakPoint()
#endif // _X86_
#else
#define BrutePoint() {}
#endif // BRUTE
#endif //CDRW_W32
#ifndef NT_NATIVE_MODE
extern "C"
ULONG
RtlCompareUnicodeString(
PUNICODE_STRING s1,
PUNICODE_STRING s2,
BOOLEAN UpCase);
extern "C"
NTSTATUS
RtlUpcaseUnicodeString(
PUNICODE_STRING dst,
PUNICODE_STRING src,
BOOLEAN Alloc
);
extern "C"
NTSTATUS
RtlAppendUnicodeToString(
IN PUNICODE_STRING Str1,
IN PWSTR Str2
);
#endif //NT_NATIVE_MODE
extern "C"
NTSTATUS
MyInitUnicodeString(
IN PUNICODE_STRING Str1,
IN PCWSTR Str2
);
#ifndef NT_NATIVE_MODE
#define KeQuerySystemTime(t) GetSystemTimeAsFileTime((LPFILETIME)(t));
typedef struct _FILE_BOTH_DIR_INFORMATION {
ULONG NextEntryOffset;
ULONG FileIndex;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaSize;
CCHAR ShortNameLength;
WCHAR ShortName[12];
WCHAR FileName[1];
} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
#endif //NT_NATIVE_MODE
typedef UCHAR KIRQL;
typedef KIRQL *PKIRQL;
typedef ULONG ERESOURCE;
typedef ERESOURCE *PERESOURCE;
#define KeRaiseIrql(irql, oldIrql) \
{ \
*oldIrql = 0; \
}
#define KeLowerIrql(oldIrql) {;}
#define KeInitializeSpinLock(sl) \
{ \
*(sl) = 0; \
}
#define KeAcquireSpinLock(sl,irql) \
{ \
ULONG isLocked = TRUE; \
while(isLocked) AcquireXLock(*(sl), isLocked, TRUE);\
}
#define ExAcquireResourceExclusiveLite(res, wait) \
{ \
ULONG isLocked = TRUE; \
while(isLocked) AcquireXLock(*(res), isLocked, TRUE);\
}
#define ExAcquireResourceSharedLite(res, wait) \
{ \
ULONG isLocked = TRUE; \
while(isLocked) AcquireXLock(*(res), isLocked, TRUE);\
}
#define KeReleaseSpinLock(sl,irql) \
{ \
ULONG isLocked; \
AcquireXLock(*(sl), isLocked, FALSE); \
}
#define ExGetCurrentResourceThread() 0
#define ExReleaseResourceForThreadLite(res, thrdID) \
{ \
ULONG isLocked; \
AcquireXLock(*(res), isLocked, FALSE); \
}
NTSTATUS inline ExInitializeResourceLite(PULONG res)
{
*(res) = 0;
return STATUS_SUCCESS;
}
#define ExDeleteResourceLite(res) \
{ \
*(res) = 0; \
}
#define ExConvertExclusiveToSharedLite(res) {/* do nothing */}
#ifndef CDRW_W32
#define UDFAcquireResourceExclusive(Resource,CanWait) \
ExAcquireResourceExclusiveLite((Resource),(CanWait))
#define UDFAcquireResourceShared(Resource,CanWait) \
ExAcquireResourceSharedLite((Resource),(CanWait))
// a convenient macro (must be invoked in the context of the thread that acquired the resource)
#define UDFReleaseResource(Resource) \
ExReleaseResourceForThreadLite((Resource), ExGetCurrentResourceThread())
#define UDFDeleteResource(Resource) \
ExDeleteResourceLite((Resource))
#define UDFConvertExclusiveToSharedLite(Resource) \
ExConvertExclusiveToSharedLite((Resource))
#define UDFInitializeResourceLite(Resource) \
ExInitializeResourceLite((Resource))
#define UDFAcquireSharedStarveExclusive(Resource,CanWait) \
ExAcquireSharedStarveExclusive((Resource),(CanWait))
#define UDFAcquireSharedWaitForExclusive(Resource,CanWait) \
ExAcquireSharedWaitForExclusive((Resource),(CanWait))
//#define UDFDebugAcquireResourceExclusiveLite(a,b,c,d) ExAcquireResourceExclusiveLite(a,b)
#define UDFInterlockedIncrement(addr) \
((*addr)++)
#define UDFInterlockedDecrement(addr) \
((*addr)--)
int
__inline
UDFInterlockedExchangeAdd(PLONG addr, LONG i) {
LONG Old = (*addr);
(*addr) += i;
return Old;
}
#endif //CDRW_W32
//
// Interrupt Request Level definitions
//
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define PROFILE_LEVEL 27 // timer used for profiling.
#define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86
#define CLOCK2_LEVEL 28 // Interval clock 2 level
#define IPI_LEVEL 29 // Interprocessor interrupt level
#define POWER_LEVEL 30 // Power failure level
#define HIGH_LEVEL 31 // Highest interrupt level
#define SYNCH_LEVEL (IPI_LEVEL-1) // synchronization level
#define KeGetCurrentIrql() PASSIVE_LEVEL
#ifndef NT_NATIVE_MODE
typedef struct _TIME_FIELDS {
USHORT Year; // range [1601...]
USHORT Month; // range [1..12]
USHORT Day; // range [1..31]
USHORT Hour; // range [0..23]
USHORT Minute; // range [0..59]
USHORT Second; // range [0..59]
USHORT Milliseconds;// range [0..999]
USHORT Weekday; // range [0..6] == [Sunday..Saturday]
} TIME_FIELDS;
typedef TIME_FIELDS *PTIME_FIELDS;
//#define RtlTimeFieldsToTime(a,b) TRUE
BOOLEAN
RtlTimeFieldsToTime(
IN PTIME_FIELDS TimeFields,
IN PLARGE_INTEGER Time
);
#define ExSystemTimeToLocalTime(SysTime, LocTime) FileTimeToLocalFileTime((PFILETIME)(SysTime), (PFILETIME)(LocTime))
//#define RtlTimeToTimeFields(a,b) {}
BOOLEAN
RtlTimeToTimeFields(
IN PLARGE_INTEGER Time,
IN PTIME_FIELDS TimeFields
);
#define ExLocalTimeToSystemTime(LocTime, SysTime) LocalFileTimeToFileTime((PFILETIME)(LocTime), (PFILETIME)(SysTime))
#endif //NT_NATIVE_MODE
#ifndef CDRW_W32
typedef struct _FSRTL_COMMON_FCB_HEADER {
SHORT NodeTypeCode;
SHORT NodeByteSize;
UCHAR Flags;
UCHAR IsFastIoPossible;
#if (_WIN32_WINNT >= 0x0400)
UCHAR Flags2;
UCHAR Reserved;
#endif // (_WIN32_WINNT >= 0x0400)
PERESOURCE Resource;
PERESOURCE PagingIoResource;
LARGE_INTEGER AllocationSize;
LARGE_INTEGER FileSize;
LARGE_INTEGER ValidDataLength;
} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
typedef struct _SECTION_OBJECT_POINTERS {
PVOID DataSectionObject;
PVOID SharedCacheMap;
PVOID ImageSectionObject;
} SECTION_OBJECT_POINTERS;
typedef SECTION_OBJECT_POINTERS *PSECTION_OBJECT_POINTERS;
extern NTSTATUS UDFPhReadSynchronous(
PDEVICE_OBJECT DeviceObject,
PVOID Buffer,
ULONG Length,
LONGLONG Offset,
PULONG ReadBytes,
ULONG Flags);
extern NTSTATUS UDFPhWriteSynchronous(
PDEVICE_OBJECT DeviceObject, // the physical device object
PVOID Buffer,
ULONG Length,
LONGLONG Offset,
PULONG WrittenBytes,
ULONG Flags);
#if 0
extern NTSTATUS
UDFPhWriteVerifySynchronous(
PDEVICE_OBJECT DeviceObject, // the physical device object
PVOID Buffer,
ULONG Length,
LONGLONG Offset,
PULONG WrittenBytes,
ULONG Flags
);
#endif
#define UDFPhWriteVerifySynchronous UDFPhWriteSynchronous
extern NTSTATUS UDFPhSendIOCTL(
IN ULONG IoControlCode,
IN PDEVICE_OBJECT DeviceObject,
IN PVOID InputBuffer ,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer ,
IN ULONG OutputBufferLength,
IN BOOLEAN OverrideVerify,
OUT PVOID Iosb OPTIONAL);
#endif //CDRW_W32
VOID set_image_size(HANDLE h,
// ULONG LBA);
int64 len);
#ifdef UDF_FORMAT_MEDIA
struct _UDFVolumeControlBlock;
#endif
#ifndef UDF_FORMAT_MEDIA
ULONG write(
HANDLE h,
PCHAR buff,
ULONG len);
#endif
extern "C"
HANDLE
my_open(
#ifndef CDRW_W32
struct _UDFVolumeControlBlock* Vcb,
#endif //CDRW_W32
PWCHAR fn);
#ifdef UDF_FORMAT_MEDIA
struct _UDFFmtState;
#endif //UDF_FORMAT_MEDIA
extern
void
my_exit(
#ifdef UDF_FORMAT_MEDIA
struct _UDFFmtState* fms,
#endif //UDF_FORMAT_MEDIA
int rc
);
#ifndef CDRW_W32
uint64 udf_lseek64(HANDLE fd, uint64 offset, int whence);
#endif //CDRW_W32
#ifdef LIBUDFFMT
BOOLEAN
udf_get_sizes(
IN PDEVICE_OBJECT DeviceObject,
IN ULONG* blocks
);
#endif //LIBUDFFMT
int64
get_file_size(
HANDLE h
);
int64
set_file_pointer(
HANDLE h,
int64 sz
);
#ifndef NT_NATIVE_MODE
typedef struct _IO_STATUS_BLOCK {
ULONG Status;
ULONG Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
#endif //NT_NATIVE_MODE
#ifndef UDF_FORMAT_MEDIA
extern ULONG LockMode;
extern BOOLEAN open_as_device;
extern BOOLEAN opt_invalidate_volume;
#endif //UDF_FORMAT_MEDIA
extern "C"
ULONG
MyLockVolume(
HANDLE h,
ULONG* pLockMode // OUT
);
extern "C"
ULONG
MyUnlockVolume(
HANDLE h,
ULONG* pLockMode // IN
);
#ifndef CDRW_W32
ULONG
UDFGetDevType(PDEVICE_OBJECT DeviceObject);
#endif //CDRW_W32
#ifndef INVALID_HANDLE_VALUE
#define INVALID_HANDLE_VALUE ((HANDLE)(-1))
#endif
#ifndef ANSI_DOS_STAR
#define ANSI_DOS_STAR ('<')
#define ANSI_DOS_QM ('>')
#define ANSI_DOS_DOT ('"')
#define DOS_STAR (L'<')
#define DOS_QM (L'>')
#define DOS_DOT (L'"')
#endif //ANSI_DOS_STAR
extern "C"
BOOLEAN
ProbeMemory(
PVOID MemPtr,
ULONG Length,
BOOLEAN ForWrite
);
#ifdef NT_NATIVE_MODE
#include "env_spec_nt.h"
#endif //NT_NATIVE_MODE
#ifndef InitializeListHead
//
// Doubly-linked list manipulation routines. Implemented as macros
// but logically these are procedures.
//
//
// VOID
// InitializeListHead(
// PLIST_ENTRY ListHead
// );
//
#define InitializeListHead(ListHead) (\
(ListHead)->Flink = (ListHead)->Blink = (ListHead))
//
// BOOLEAN
// IsListEmpty(
// PLIST_ENTRY ListHead
// );
//
#define IsListEmpty(ListHead) \
((ListHead)->Flink == (ListHead))
//
// PLIST_ENTRY
// RemoveHeadList(
// PLIST_ENTRY ListHead
// );
//
#define RemoveHeadList(ListHead) \
(ListHead)->Flink;\
{RemoveEntryList((ListHead)->Flink)}
//
// PLIST_ENTRY
// RemoveTailList(
// PLIST_ENTRY ListHead
// );
//
#define RemoveTailList(ListHead) \
(ListHead)->Blink;\
{RemoveEntryList((ListHead)->Blink)}
//
// VOID
// RemoveEntryList(
// PLIST_ENTRY Entry
// );
//
#define RemoveEntryList(Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_Flink;\
_EX_Flink = (Entry)->Flink;\
_EX_Blink = (Entry)->Blink;\
_EX_Blink->Flink = _EX_Flink;\
_EX_Flink->Blink = _EX_Blink;\
}
//
// VOID
// InsertTailList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//
#define InsertTailList(ListHead,Entry) {\
PLIST_ENTRY _EX_Blink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Blink = _EX_ListHead->Blink;\
(Entry)->Flink = _EX_ListHead;\
(Entry)->Blink = _EX_Blink;\
_EX_Blink->Flink = (Entry);\
_EX_ListHead->Blink = (Entry);\
}
//
// VOID
// InsertHeadList(
// PLIST_ENTRY ListHead,
// PLIST_ENTRY Entry
// );
//
#define InsertHeadList(ListHead,Entry) {\
PLIST_ENTRY _EX_Flink;\
PLIST_ENTRY _EX_ListHead;\
_EX_ListHead = (ListHead);\
_EX_Flink = _EX_ListHead->Flink;\
(Entry)->Flink = _EX_Flink;\
(Entry)->Blink = _EX_ListHead;\
_EX_Flink->Blink = (Entry);\
_EX_ListHead->Flink = (Entry);\
}
#endif //InitializeListHead
#endif // __ENV_SPEC_W32__H_