Something went wrong. Try again.
Reactos
Something went wrong. Try again.
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151////////////////////////////////////////////////////////////////////// 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.////////////////////////////////////////////////////////////////////
#ifndef UDF_FORMAT_MEDIAULONG LockMode = 0;BOOLEAN opt_invalidate_volume = FALSE;#endif //UDF_FORMAT_MEDIA
#ifndef CDRW_W32#ifndef UDF_FORMAT_MEDIABOOLEAN open_as_device = FALSE;#endif //UDF_FORMAT_MEDIA#ifdef USE_SKIN_MODEL
PSKIN_API SkinAPI = NULL;
PSKIN_APISkinLoad( PWCHAR path, HINSTANCE hInstance, // handle to current instance HINSTANCE hPrevInstance, // handle to previous instance int nCmdShow // show state ){ HMODULE hm; PSKIN_API Skin; PSKIN_API (__stdcall *SkinInit) (VOID);
hm = LoadLibraryW(path); if(!hm) return NULL; SkinInit = (PSKIN_API(__stdcall *)(void))GetProcAddress(hm, "SkinInit"); if(!SkinInit) return NULL; Skin = SkinInit(); if(!Skin) return NULL; Skin->Init(hInstance, hPrevInstance, nCmdShow); return Skin;}
#endif //USE_SKIN_MODEL
#ifdef _BROWSE_UDF_#ifndef LIBUDF
extern PVCB Vcb;
#endif // LIBUDF#endif //_BROWSE_UDF_
#ifdef LIBUDF#define _lphUdf ((PUDF_VOL_HANDLE_I)(DeviceObject->lpContext))#endif //LIBUDF#ifdef LIBUDFFMT#define _lphUdf (DeviceObject->cbio)#endif //LIBUDFFMT
#ifndef CDRW_W32
NTSTATUSUDFPhSendIOCTL( 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 ){ ULONG real_read;#if !defined(LIBUDF) && !defined(LIBUDFFMT) ULONG ret;
ULONG RC = DeviceIoControl(DeviceObject->h,IoControlCode, InputBuffer,InputBufferLength, OutputBuffer,OutputBufferLength, &real_read,NULL);
if (!RC) { ret = GetLastError(); } return RC ? 1 : -1;
#else // LIBUDF
ULONG RC = _lphUdf->lpIOCtlFunc(_lphUdf->lpParameter,IoControlCode, InputBuffer,InputBufferLength, OutputBuffer,OutputBufferLength, &real_read);
return RC;
#endif // LIBUDF
} // end UDFPhSendIOCTL()
NTSTATUSUDFPhReadSynchronous( PDEVICE_OBJECT DeviceObject, // the physical device object PVOID Buffer, ULONG Length, LONGLONG Offset, PULONG ReadBytes, ULONG Flags ){
#if !defined(LIBUDF) && !defined(LIBUDFFMT)
NTSTATUS RC;// UDFPrint(("UDFPhRead: Length: %x Lba: %lx\n",Length>>0xb,Offset>>0xb)); LONG HiOffs = (ULONG)(Offset >> 32);
RC = SetFilePointer(DeviceObject->h,(ULONG)Offset,&HiOffs,FILE_BEGIN); if(RC == INVALID_SET_FILE_POINTER) { if(GetLastError() != NO_ERROR) { UDFPrint(("UDFPhReadSynchronous: error %x\n", GetLastError())); return STATUS_END_OF_FILE; } } RC = ReadFile(DeviceObject->h,Buffer,Length,ReadBytes,NULL); if(NT_SUCCESS(RC) && (!(*ReadBytes))) { RC = GetLastError(); return STATUS_END_OF_FILE; } return STATUS_SUCCESS;
#else // LIBUDF
return _lphUdf->lpReadFunc(_lphUdf->lpParameter, Buffer, Length, Offset, ReadBytes);
#endif //defined LIBUDF || defined LIBUDFFMT
} // end UDFPhReadSynchronous()
NTSTATUSUDFPhWriteSynchronous( PDEVICE_OBJECT DeviceObject, // the physical device object PVOID Buffer, ULONG Length, LONGLONG Offset, PULONG WrittenBytes, ULONG Flags ){#if !defined(LIBUDF) && !defined(LIBUDFFMT)
NTSTATUS RC = STATUS_SUCCESS; LONG HiOffs = (ULONG)(Offset >> 32); PVOID Buffer2 = NULL; PVOID Buffer3 = NULL;
RC = SetFilePointer(DeviceObject->h,(ULONG)Offset,&HiOffs,FILE_BEGIN); if(RC == INVALID_SET_FILE_POINTER) { if(GetLastError() != NO_ERROR) { UDFPrint(("UDFPhWriteSynchronous: error %x\n", GetLastError())); return STATUS_END_OF_FILE; } }
Buffer2 = ExAllocatePool(NonPagedPool, Length+0x10000); Buffer3 = (PVOID)( ((ULONG)Buffer2 + 0xffff) & ~0xffff); RtlCopyMemory(Buffer3, Buffer, Length);
RC = WriteFile(DeviceObject->h,Buffer3,Length,WrittenBytes,NULL); if(!RC || !(*WrittenBytes)) { RC = GetLastError(); UDFPrint(("UDFPhWriteSynchronous: EOF, error %x\n", RC)); RC = STATUS_END_OF_FILE; } else { RC = STATUS_SUCCESS; }
if(Buffer2) ExFreePool(Buffer2);
return RC;
#else // LIBUDF
return _lphUdf->lpWriteFunc(_lphUdf->lpParameter, Buffer, Length, Offset, WrittenBytes);
#endif // LIBUDF
} // end UDFPhWriteSynchronous()
#if 0NTSTATUSUDFPhWriteVerifySynchronous( PDEVICE_OBJECT DeviceObject, // the physical device object PVOID Buffer, ULONG Length, LONGLONG Offset, PULONG WrittenBytes, ULONG Flags ){ NTSTATUS RC; PUCHAR v_buff = NULL; ULONG ReadBytes;
RC = UDFPhWriteSynchronous(DeviceObject, Buffer, Length, Offset, WrittenBytes, 0); if(!Verify) return RC; v_buff = (PUCHAR)DbgAllocatePool(NonPagedPool, Length); if(!v_buff) return RC;
RC = UDFPhSendIOCTL( IOCTL_CDRW_SYNC_CACHE, DeviceObject, NULL,0, NULL,0, FALSE, NULL);
RC = UDFPhReadSynchronous(DeviceObject, v_buff, Length, Offset, &ReadBytes, 0); if(!NT_SUCCESS(RC)) { BrutePoint(); DbgFreePool(v_buff); return RC; } if(RtlCompareMemory(v_buff, Buffer, ReadBytes) == Length) { DbgFreePool(v_buff); return RC; } BrutePoint(); DbgFreePool(v_buff); return STATUS_LOST_WRITEBEHIND_DATA;} // end UDFPhWriteVerifySynchronous()#endif
VOIDset_image_size( HANDLE h,// ULONG LBA) int64 len){ LONG offh = (ULONG)(len >> 32); //( (LONGLONG)LBA >> (32-Vcb->BlockSizeBits) );
SetFilePointer((HANDLE)h, (ULONG)(len /*(LBA << Vcb->BlockSizeBits)*/ ), &offh, FILE_BEGIN); SetEndOfFile(h); offh = 0; SetFilePointer((HANDLE)h, 0, &offh, FILE_BEGIN);} // end set_image_size()
int64get_file_size( HANDLE h ){ LONG hsz = 0; LONG lsz;
lsz = SetFilePointer(h, 0, &hsz, FILE_END); return (((int64)hsz) << 32) | lsz;} // end get_file_size()
int64set_file_pointer( HANDLE h, int64 sz ){ ULONG hsz = (ULONG)(sz >> 32); ULONG lsz = (ULONG)sz;
lsz = SetFilePointer(h, lsz, (PLONG)&hsz, FILE_BEGIN); return (((int64)hsz) << 32) | lsz;} // end set_file_pointer()
#endif //CDRW_W32
#ifndef LIBUDF
#ifndef UDF_FORMAT_MEDIA
ULONGwrite( PVCB Vcb, HANDLE h, PCHAR buff, ULONG len){ ULONG written; LONG offh = 0; ULONG offl = SetFilePointer((HANDLE)h, 0, &offh, FILE_CURRENT);// ULONG Lba = (ULONG)((((LONGLONG)offh << 32) + offl) >> Vcb->BlockSizeBits);
UDFWriteData(Vcb, FALSE, (((LONGLONG)offh)<<32)+offl, len, FALSE, buff, &written);
SetFilePointer((HANDLE)h, offl, &offh, FILE_BEGIN); offh = 0; SetFilePointer((HANDLE)h, written, &offh, FILE_CURRENT);
return written;} // end write()#endif //UDF_FORMAT_MEDIA
#endif // LIBUDF
#endif //CDRW_W32
#ifdef NT_NATIVE_MODE
BOOLPrivilege( LPTSTR pszPrivilege, BOOL bEnable ){#ifndef NT_NATIVE_MODE HANDLE hToken; TOKEN_PRIVILEGES tp;
// obtain the token, first check the thread and then the process if (!OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, TRUE, &hToken)) { if (GetLastError() == ERROR_NO_TOKEN) { if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) { return FALSE; } } else { return FALSE; } }
// get the luid for the privilege if (!LookupPrivilegeValue(NULL, pszPrivilege, &tp.Privileges[0].Luid)) { CloseHandle(hToken); return FALSE; }
tp.PrivilegeCount = 1;
if (bEnable) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0;
// enable or disable the privilege if (!AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0)) { CloseHandle(hToken); return FALSE; }
if (!CloseHandle(hToken)) return FALSE;
#endif //NT_NATIVE_MODE
return TRUE;
} // end Privilege()#endif //NT_NATIVE_MODE
#ifndef LIBUDF
extern "C"ULONGMyLockVolume( HANDLE h, ULONG* pLockMode // OUT ){ ULONG RC; ULONG returned;
(*pLockMode) = -1;#ifndef CDRW_W32 RC = DeviceIoControl(h,IOCTL_UDF_LOCK_VOLUME_BY_PID,NULL,0,NULL,0,&returned,NULL); if(RC) { (*pLockMode) = IOCTL_UDF_LOCK_VOLUME_BY_PID; return STATUS_SUCCESS; }#endif //CDRW_W32
RC = DeviceIoControl(h,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&returned,NULL); if(RC) { (*pLockMode) = FSCTL_LOCK_VOLUME; return STATUS_SUCCESS; } return STATUS_UNSUCCESSFUL;} // MyLockVolume()
extern "C"ULONGMyUnlockVolume( HANDLE h, ULONG* pLockMode // IN ){ ULONG returned;
#ifndef CDRW_W32 if((*pLockMode) == IOCTL_UDF_LOCK_VOLUME_BY_PID) { return DeviceIoControl(h,IOCTL_UDF_UNLOCK_VOLUME_BY_PID,NULL,0,NULL,0,&returned,NULL); }#endif //CDRW_W32
return DeviceIoControl(h,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&returned,NULL);
} // MyUnlockVolume()
voidmy_retrieve_vol_type(#ifndef CDRW_W32 PVCB Vcb,#endif PWCHAR fn ){#ifndef CDRW_W32 if(wcslen(fn) == 2 && fn[1] == ':') { ULONG DevType = GetDriveTypeW(fn); UDFPrint((" DevType %x\n", DevType)); switch(DevType) { case DRIVE_CDROM: Vcb->PhDeviceType = FILE_DEVICE_CD_ROM; break; default: Vcb->PhDeviceType = FILE_DEVICE_DISK; break; } } if(wcslen(fn) == 2 && fn[1] == ';') { UserPrint(("Warrning: File name is similar to drive letter.\n" " Don't you type semicolon ';' instead of colon ':' ?\n")); }#endif //CDRW_W32} // end my_retrieve_vol_type()
#ifdef NT_NATIVE_MODE#define GetLastError() ((ULONG)(-1))#endif //NT_NATIVE_MODE
#define MAX_INVALIDATE_VOLUME_RETRY 8
extern "C"HANDLEmy_open(#ifndef CDRW_W32 PVCB Vcb,#endif PWCHAR fn ){ HANDLE h/*, h2*/; WCHAR deviceNameBuffer[0x200]; WCHAR FSNameBuffer[0x200];// CCHAR RealDeviceName[0x200];// WCHAR DeviceName[MAX_PATH+1]; ULONG RC; ULONG retry; ULONG i; BOOLEAN CantLock = FALSE; PULONG pLockMode;#ifdef NT_NATIVE_MODE IO_STATUS_BLOCK ioStatus; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING uniFilename;#endif //NT_NATIVE_MODE ULONG returned;
#ifndef CDRW_W32#ifdef UDF_FORMAT_MEDIA PUDFFmtState fms = Vcb->fms; fms->#endif open_as_device = TRUE;#endif //CDRW_W32
pLockMode = &#ifdef UDF_FORMAT_MEDIA fms->#endif LockMode;
// make several retries to workaround smart applications, // those attempts to work with volume immediately after arrival retry = 1 +#ifdef UDF_FORMAT_MEDIA fms->#endif opt_invalidate_volume ? 0 : MAX_INVALIDATE_VOLUME_RETRY;
#ifndef NT_NATIVE_MODE swprintf(deviceNameBuffer, L"%ws\\", fn); UDFPrint(("my_open: %S\n", fn)); i = sizeof(FSNameBuffer)/sizeof(FSNameBuffer[0]); if(GetVolumeInformationW(deviceNameBuffer, NULL, 0, &returned, &returned, &returned, FSNameBuffer, i)) { UDFPrint(("my_open: FS: %S\n", FSNameBuffer)); if(!wcscmp(FSNameBuffer, L"Unknown")) { retry++; } } else { UDFPrint(("my_open: FS: ???\n")); } UDFPrint(("my_open: retry %d times\n", retry));
#endif //NT_NATIVE_MODE
do { // open as device#ifndef NT_NATIVE_MODE swprintf(deviceNameBuffer, L"\\\\.\\%ws", fn); if(wcslen(fn) == 2 && fn[1] == ';') { UserPrint(("Warrning: File name is similar to drive letter.\n" " Don't you type semicolon ';' instead of colon ':' ?\n")); } h = (HANDLE)(-1); for(i=0; i<4; i++) { if(h == ((HANDLE)-1)) { h = CreateFileW(deviceNameBuffer, GENERIC_READ | GENERIC_WRITE, ((i & 1) ? 0 : FILE_SHARE_READ) | ((i & 2) ? 0 : FILE_SHARE_WRITE), NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, NULL); if(h != ((HANDLE)-1)) { UDFPrint((" opened i=%x\n", i)); } } }#else //NT_NATIVE_MODE uniFilename.Length = swprintf(deviceNameBuffer, L"\\??\\%ws", fn); uniFilename.Buffer = deviceNameBuffer; uniFilename.Length *= sizeof(WCHAR); uniFilename.MaximumLength = uniFilename.Length + sizeof(WCHAR);
h = (HANDLE)(-1); for(i=0; i<4; i++) { InitializeObjectAttributes(&ObjectAttributes, &uniFilename, OBJ_CASE_INSENSITIVE, NULL, NULL); if(h == ((HANDLE)-1)) { RC = NtCreateFile(&h, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &ObjectAttributes, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, ((i & 1) ? 0 : FILE_SHARE_READ) | ((i & 2) ? 0 : FILE_SHARE_WRITE), FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_COMPLETE_IF_OPLOCKED | FILE_WRITE_THROUGH | FILE_NO_INTERMEDIATE_BUFFERING, NULL, 0); if(!NT_SUCCESS(RC)) { UDFPrint((" opened i2=%x\n", i)); h = ((HANDLE)-1); } } }#endif //NT_NATIVE_MODE if(h != ((HANDLE)-1)) {#ifndef CDRW_W32#ifdef UDF_FORMAT_MEDIA if(fms->opt_flush || fms->opt_probe) { return h; }#endif //UDF_FORMAT_MEDIA my_retrieve_vol_type(Vcb, fn);#else my_retrieve_vol_type(fn);#endif //CDRW_W32 if(!NT_SUCCESS(MyLockVolume(h,pLockMode))) {#ifndef CDRW_W32 if(retry < MAX_INVALIDATE_VOLUME_RETRY) { retry++; if(!Privilege(SE_TCB_NAME, TRUE)) { UDFPrint(("SE_TCB privilege not held\n")); } else if(DeviceIoControl(h,FSCTL_INVALIDATE_VOLUMES,&h,sizeof(h),NULL,0,&returned,NULL) ) { UDFPrint((" FSCTL_INVALIDATE_VOLUMES ok, status %x\n", GetLastError())); CloseHandle(h); continue; } else {//#ifndef CDRW_W32 UDFPrint((" FSCTL_INVALIDATE_VOLUMES failed, error %x\n", GetLastError())); RC = GetLastError(); if(DeviceIoControl(h,IOCTL_UDF_INVALIDATE_VOLUMES,&h,sizeof(h),NULL,0,&returned,NULL) ) { UDFPrint((" IOCTL_UDF_INVALIDATE_VOLUMES ok, status %x\n", GetLastError())); CloseHandle(h); continue; } UDFPrint((" IOCTL_UDF_INVALIDATE_VOLUMES, error %x\n", GetLastError()));//#endif //CDRW_W32 } UserPrint(("can't lock volume, retry\n")); CloseHandle(h); continue; }#endif //CDRW_W32 UserPrint(("can't lock volume\n"));#ifndef NT_NATIVE_MODE // In native mode the volume can be not mounted yet !!! CantLock = TRUE; CloseHandle(h); h = NULL; goto try_as_file;#endif //NT_NATIVE_MODE }//#ifndef CDRW_W32 if(!DeviceIoControl(h,FSCTL_ALLOW_EXTENDED_DASD_IO,NULL,0,NULL,0,&returned,NULL)) { UDFPrint(("Warning: can't allow extended DASD i/o\n")); }//#endif //CDRW_W32
UDFPrint((" opened, h=%x\n", h)); return h; } RC = GetLastError();
#ifndef NT_NATIVE_MODE h = CreateFileW(deviceNameBuffer, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);#else //NT_NATIVE_MODE RC = NtCreateFile(&h, GENERIC_READ | SYNCHRONIZE | FILE_READ_ATTRIBUTES, &ObjectAttributes, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_COMPLETE_IF_OPLOCKED | FILE_WRITE_THROUGH, NULL, 0); if(!NT_SUCCESS(RC)) { h = ((HANDLE)-1); }#endif //NT_NATIVE_MODE if(h != ((HANDLE)-1)) {
UDFPrint((" opened R/O, h=%x\n", h));#ifndef CDRW_W32 my_retrieve_vol_type(Vcb, fn);#else my_retrieve_vol_type(fn);#endif
UserPrint(("read-only open\n")); if(!NT_SUCCESS(MyLockVolume(h,pLockMode))) {#ifndef CDRW_W32 if(retry < MAX_INVALIDATE_VOLUME_RETRY) { retry++; if(!Privilege(SE_TCB_NAME, TRUE)) { UDFPrint(("SE_TCB privilege not held\n")); } else if(DeviceIoControl(h,FSCTL_INVALIDATE_VOLUMES,&h,sizeof(h),NULL,0,&returned,NULL) ) { CloseHandle(h); continue; } UserPrint(("can't lock read-only volumem retry")); CloseHandle(h); continue; }#endif //CDRW_W32 UserPrint(("can't lock read-only volume"));#ifndef NT_NATIVE_MODE CantLock = TRUE; CloseHandle(h); h = NULL; goto try_as_file;#endif //NT_NATIVE_MODE }// write_cdfs = TRUE;// DeviceIoControl(h,FSCTL_DISMOUNT_VOLUME,NULL,0,NULL,0,&returned,NULL); return h; }#ifndef NT_NATIVE_MODEtry_as_file:#endif //NT_NATIVE_MODE
#ifndef CDRW_W32#ifdef UDF_FORMAT_MEDIA fms->#endif open_as_device = FALSE; // open as plain file Vcb->PhDeviceType = FILE_DEVICE_DISK;#endif //CDRW_W32
UserPrint(("try image file\n"));#ifndef NT_NATIVE_MODE h = CreateFileW(fn, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);#else //NT_NATIVE_MODE RC = NtCreateFile(&h, GENERIC_READ | SYNCHRONIZE, &ObjectAttributes, &ioStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN, FILE_SYNCHRONOUS_IO_NONALERT | FILE_COMPLETE_IF_OPLOCKED | FILE_WRITE_THROUGH, NULL, 0); if(!NT_SUCCESS(RC)) { h = ((HANDLE)-1); }#endif //NT_NATIVE_MODE if(h == ((HANDLE)-1)) {
RC = GetLastError(); if(CantLock) {#ifndef CDRW_W32 my_exit(#ifdef UDF_FORMAT_MEDIA fms,#endif MKUDF_CANT_LOCK_VOL);#else return NULL;#endif //CDRW_W32 }#ifndef CDRW_W32 UserPrint(("error opening device or image file")); my_exit(#ifdef UDF_FORMAT_MEDIA fms,#endif MKUDF_CANT_OPEN_FILE);#else return NULL;#endif //CDRW_W32 } UDFPrint((" opened as file, h=%x\n", h)); break;
} while(TRUE); return h;} // end my_open()
#endif //LIBUDF
#ifndef CDRW_W32
uint64udf_lseek64( HANDLE fd, uint64 offset, int whence){ LONG offh = (ULONG)(offset>>32); LONG offl; offl = SetFilePointer(fd, (ULONG)offset, &offh, whence); if(offl == -1 && offh == -1) { return -1; } return (((uint64)offh) << 32) | (uint64)offl;} // end udf_lseek64()
#ifdef LIBUDFFMTBOOLEANudf_get_sizes( IN PDEVICE_OBJECT DeviceObject, IN ULONG* blocks ){ ULONG bs; int64 sz; ULONG RC;
RC = _lphUdf->lpGetSizeFunc(_lphUdf->lpParameter, &sz, &bs);
(*blocks) = (ULONG)(sz/bs);
return(OS_SUCCESS(RC));}#endif //LIBUDFFMT
#include "string_lib.cpp"
#ifdef _BROWSE_UDF_#ifndef LIBUDF
ULONGUDFGetDevType( PDEVICE_OBJECT DeviceObject ){ if(DeviceObject && DeviceObject == Vcb->TargetDeviceObject) { return Vcb->PhDeviceType; } return FILE_DEVICE_DISK;} // end UDFGetDevType()
#else // LIBUDF
ULONGUDFGetDevType( PDEVICE_OBJECT DeviceObject ){#define lphUdf ((PUDF_VOL_HANDLE_I)(DeviceObject->lpContext)) return lphUdf->bHddDevice ? FILE_DEVICE_DISK : FILE_DEVICE_CD_ROM;#undef lphUdf} // end UDFGetDevType()
#endif // LIBUDF
#endif //_BROWSE_UDF_
#endif //CDRW_W32
#ifndef NT_NATIVE_MODE
#ifdef PRINT_DBG_CONSOLECHAR dbg_print_tmp_buff[2048];
BOOLEAN was_enter = TRUE;
extern "C"VOIDPrintDbgConsole( PCHAR DebugMessage, ... ){ int len; va_list ap; va_start(ap, DebugMessage);
if(was_enter) { strcpy(&dbg_print_tmp_buff[0], JS_DBG_PREFIX); len = _vsnprintf(&dbg_print_tmp_buff[sizeof(JS_DBG_PREFIX)-1], 2047-sizeof(JS_DBG_PREFIX), DebugMessage, ap); } else { len = _vsnprintf(&dbg_print_tmp_buff[0], 2047, DebugMessage, ap); } dbg_print_tmp_buff[2047] = 0; if(len > 0 && (dbg_print_tmp_buff[len-1] == '\n' || dbg_print_tmp_buff[len-1] == '\r') ) { was_enter = TRUE; } else { was_enter = FALSE; }
OutputDebugString(&dbg_print_tmp_buff[0]);
va_end(ap);
} // end PrintDbgConsole()#else // PRINT_DBG_CONSOLEVOIDPrintDbgConsole( PCHAR DebugMessage, ... ){} // end ClassDebugPrint()#endif //PRINT_DBG_CONSOLE
BOOLEANRtlTimeFieldsToTime( IN PTIME_FIELDS TimeFields, IN PLARGE_INTEGER Time ){ SYSTEMTIME st;
st.wYear = TimeFields->Year; st.wMonth = TimeFields->Month; st.wDayOfWeek = 0; st.wDay = TimeFields->Day; st.wHour = TimeFields->Hour; st.wMinute = TimeFields->Minute; st.wSecond = TimeFields->Second; st.wMilliseconds = TimeFields->Milliseconds;
return SystemTimeToFileTime(&st, (PFILETIME)Time);} // end RtlTimeFieldsToTime()
BOOLEANRtlTimeToTimeFields( IN PLARGE_INTEGER Time, IN PTIME_FIELDS TimeFields ){ SYSTEMTIME st; BOOLEAN retval;
retval = FileTimeToSystemTime((PFILETIME)Time, &st);
TimeFields->Year = st.wYear; TimeFields->Month = st.wMonth; TimeFields->Weekday = st.wDayOfWeek; TimeFields->Day = st.wDay; TimeFields->Hour = st.wHour; TimeFields->Minute = st.wMinute; TimeFields->Second = st.wSecond; TimeFields->Milliseconds = st.wMilliseconds;
return retval;} // end ()
#endif //NT_NATIVE_MODE
#ifdef USE_THREAD_HEAPS
HANDLE MemLock = NULL;
VOIDExInitThreadPools(){ MemLock = CreateMutex(NULL, 0, NULL);}
VOIDExDeInitThreadPools(){ if(MemLock) CloseHandle(MemLock);}
#define MAX_THREADS_WITH_OWN_POOL 128
typedef struct _THREAD_POOL_LIST_ITEM { HANDLE HeapHandle; ULONG ThreadId;} THREAD_POOL_LIST_ITEM, *PTHREAD_POOL_LIST_ITEM;
ULONG LastThreadPool = -1;THREAD_POOL_LIST_ITEM ThreadPoolList[MAX_THREADS_WITH_OWN_POOL];
extern "C"PVOID#ifdef KERNEL_MODE_MM_BEHAVIOR_ExAllocatePool_(#elseExAllocatePool(#endif ULONG MemoryType, ULONG Size ){ ULONG i; ULONG ThreadId = GetCurrentThreadId(); BOOLEAN found = FALSE;
WaitForSingleObject(MemLock,-1);
for(i=0; i<(LastThreadPool+1); i++) { if(ThreadPoolList[i].ThreadId == ThreadId) { found = TRUE; break; } } if(found) { ReleaseMutex(MemLock); return HeapAlloc(ThreadPoolList[i].HeapHandle, HEAP_NO_SERIALIZE, Size); } for(i=0; i<(LastThreadPool+1); i++) { if(ThreadPoolList[i].ThreadId == -1) { break; } } if(i>=MAX_THREADS_WITH_OWN_POOL) { ReleaseMutex(MemLock); return NULL; } ThreadPoolList[i].ThreadId = ThreadId; ThreadPoolList[i].HeapHandle = HeapCreate(HEAP_NO_SERIALIZE, 128*PAGE_SIZE, 0); if(!ThreadPoolList[i].HeapHandle) { ThreadPoolList[i].ThreadId = -1; ReleaseMutex(MemLock); return NULL; }
if(i+1 > LastThreadPool+1) LastThreadPool = i;
ReleaseMutex(MemLock);
return HeapAlloc(ThreadPoolList[i].HeapHandle, HEAP_NO_SERIALIZE, Size);
} // end ExAllocatePool()
extern "C"VOID#ifdef KERNEL_MODE_MM_BEHAVIOR_ExFreePool_(#elseExFreePool(#endif PVOID Addr ){ ULONG ThreadId = GetCurrentThreadId(); ULONG i;
WaitForSingleObject(MemLock,-1); for(i=0; i<(LastThreadPool+1); i++) { if(ThreadPoolList[i].ThreadId == ThreadId) { break; } } if(i+1 > LastThreadPool+1) { // Not found BrutePoint(); //__asm int 3; return; } HeapFree(ThreadPoolList[i].HeapHandle, HEAP_NO_SERIALIZE, Addr);
ReleaseMutex(MemLock);
} // end ExFreePool()
extern "C"VOIDExFreeThreadPool(){ ULONG ThreadId = GetCurrentThreadId(); ULONG i;
WaitForSingleObject(MemLock,-1); for(i=0; i<(LastThreadPool+1); i++) { if(ThreadPoolList[i].ThreadId == ThreadId) { break; } } if(i+1 > LastThreadPool+1) { // Not found BrutePoint(); //__asm int 3; return; } HeapDestroy(ThreadPoolList[i].HeapHandle); ThreadPoolList[i].HeapHandle = INVALID_HANDLE_VALUE; ThreadPoolList[i].ThreadId = -1;
ReleaseMutex(MemLock);}
#endif //USE_THREAD_HEAPS
#if defined(KERNEL_MODE_MM_BEHAVIOR)extern "C"PVOIDExAllocatePool( ULONG MemoryType, ULONG Size ){ PVOID Addr; PVOID uAddr; if(Size < PAGE_SIZE) {#ifdef USE_THREAD_HEAPS Addr = _ExAllocatePool_(MemoryType, Size+8);#else Addr = GlobalAlloc(GMEM_DISCARDABLE, Size+8);#endif if(!Addr) return NULL; uAddr = ((PCHAR)Addr)+8; } else {#ifdef USE_THREAD_HEAPS Addr = _ExAllocatePool_(MemoryType, Size+PAGE_SIZE*2);#else Addr = GlobalAlloc(GMEM_DISCARDABLE, Size+PAGE_SIZE*2);#endif if(!Addr) return NULL; uAddr = (PVOID)(((ULONG)(((PCHAR)Addr)+PAGE_SIZE)) & ~(PAGE_SIZE-1)); } *(((PULONG)uAddr)-2) = (ULONG)Addr; *(((PULONG)uAddr)-1) = 0xFEDCBA98; return uAddr;} // end ExAllocatePool()
extern "C"VOIDExFreePool( PVOID uAddr ){ PVOID Addr;
if(*(((PULONG)uAddr)-1) == 0xFEDCBA98) { Addr = (PVOID)(*(((PULONG)uAddr)-2));#ifdef USE_THREAD_HEAPS _ExFreePool_(Addr);#else GlobalFree(Addr);#endif return; } BrutePoint();} // end ExFreePool()#endif //defined(KERNEL_MODE_MM_BEHAVIOR) || defined(NT_NATIVE_MODE)
#ifdef _lphUdf#undef _lphUdf#endif //_lphUdf
extern "C"BOOLEANProbeMemory( PVOID MemPtr, ULONG Length, BOOLEAN ForWrite ){ ULONG i; UCHAR a; if(!MemPtr && !Length) return TRUE; if(!MemPtr || !Length) return FALSE; _SEH2_TRY { a = ((PCHAR)MemPtr)[Length-1]; if(ForWrite) { ((PCHAR)MemPtr)[Length-1] = a; } for(i=0; i<Length; i+=PAGE_SIZE) { a = ((PCHAR)MemPtr)[i]; if(ForWrite) { ((PCHAR)MemPtr)[i] = a; } } } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { return FALSE; } _SEH2_END; return TRUE;} // end ProbeMemory()
#ifdef NT_NATIVE_MODE#include "env_spec_nt.cpp"#endif //NT_NATIVE_MODE