ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
April 2008
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
21 participants
395 discussions
Start a n
N
ew thread
[tkreuzer] 33137: ULONG -> SIZE_T
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 24 20:42:25 2008 New Revision: 33137 URL:
http://svn.reactos.org/svn/reactos?rev=33137&view=rev
Log: ULONG -> SIZE_T Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c Modified: trunk/reactos/subsystems/win32/win32k/main/dllmain.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ma…
============================================================================== --- trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/main/dllmain.c [iso-8859-1] Thu Apr 24 20:42:25 2008 @@ -76,7 +76,7 @@ if (Create) { - ULONG ViewSize = 0; + SIZE_T ViewSize = 0; LARGE_INTEGER Offset; PVOID UserBase = NULL; NTSTATUS Status;
16 years, 8 months
1
0
0
0
[tkreuzer] 33136: ULONG -> SIZE_T for ZwAllocateVirtualMemory and MmMapViewOfSection
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 24 20:16:08 2008 New Revision: 33136 URL:
http://svn.reactos.org/svn/reactos?rev=33136&view=rev
Log: ULONG -> SIZE_T for ZwAllocateVirtualMemory and MmMapViewOfSection Modified: trunk/reactos/subsystems/win32/win32k/misc/usrheap.c Modified: trunk/reactos/subsystems/win32/win32k/misc/usrheap.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/mi…
============================================================================== --- trunk/reactos/subsystems/win32/win32k/misc/usrheap.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/misc/usrheap.c [iso-8859-1] Thu Apr 24 20:16:08 2008 @@ -109,7 +109,7 @@ { PVOID MappedView = NULL; LARGE_INTEGER Offset; - ULONG ViewSize = PAGE_SIZE; + SIZE_T ViewSize = PAGE_SIZE; RTL_HEAP_PARAMETERS Parameters = {0}; HANDLE hHeap; NTSTATUS Status;
16 years, 8 months
1
0
0
0
[tkreuzer] 33135: fix cast of pointer: ULONG -> ULONG_PTR
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 24 20:09:28 2008 New Revision: 33135 URL:
http://svn.reactos.org/svn/reactos?rev=33135&view=rev
Log: fix cast of pointer: ULONG -> ULONG_PTR Modified: trunk/reactos/subsystems/win32/win32k/ldr/loader.c Modified: trunk/reactos/subsystems/win32/win32k/ldr/loader.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ld…
============================================================================== --- trunk/reactos/subsystems/win32/win32k/ldr/loader.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ldr/loader.c [iso-8859-1] Thu Apr 24 20:09:28 2008 @@ -90,7 +90,7 @@ Ordinal &= 0x0000FFFF; if (Ordinal - ExportDir->Base < ExportDir->NumberOfFunctions) { - *ProcedureAddress = (PVOID)((ULONG)BaseAddress + (ULONG)AddressPtr[Ordinal - ExportDir->Base]); + *ProcedureAddress = (PVOID)((ULONG_PTR)BaseAddress + (ULONG_PTR)AddressPtr[Ordinal - ExportDir->Base]); return STATUS_SUCCESS; } DPRINT1("LdrGetProcedureAddress: Can't resolve symbol @%d\n", Ordinal); @@ -269,7 +269,7 @@ { NTSTATUS Status; - DPRINT("hModule 0x%x\n", hModule); + DPRINT("hModule 0x%x\n", hModule); Status = ZwSetSystemInformation(SystemUnloadGdiDriverInformation, &hModule, sizeof(HANDLE)); @@ -292,7 +292,7 @@ Current = CONTAINING_RECORD(CurrentEntry, DRIVERS, ListEntry); if( Current ) { - if(Current->ImageHandle == hModule) { + if(Current->ImageHandle == hModule) { ExFreePool(Current->DriverName.Buffer); RemoveEntryList(&Current->ListEntry); ExFreePool(Current);
16 years, 8 months
1
0
0
0
[tkreuzer] 33134: fix EngAllocUserMem parameter
by tkreuzer@svn.reactos.org
Author: tkreuzer Date: Thu Apr 24 19:38:32 2008 New Revision: 33134 URL:
http://svn.reactos.org/svn/reactos?rev=33134&view=rev
Log: fix EngAllocUserMem parameter Modified: trunk/reactos/subsystems/win32/win32k/eng/mem.c Modified: trunk/reactos/subsystems/win32/win32k/eng/mem.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/en…
============================================================================== --- trunk/reactos/subsystems/win32/win32k/eng/mem.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/eng/mem.c [iso-8859-1] Thu Apr 24 19:38:32 2008 @@ -72,7 +72,7 @@ * @implemented */ PVOID STDCALL -EngAllocUserMem(ULONG cj, ULONG Tag) +EngAllocUserMem(SIZE_T cj, ULONG Tag) { PVOID NewMem = NULL; NTSTATUS Status;
16 years, 8 months
1
0
0
0
[fireball] 33133: - Rewrite NtRead/WriteVirtualMemory around MiCopyVirtualMemory, and use MmMapLockedPagesSpecifyCache to do the bulk of the work, instead of the MDL hacks that were previously used. - Reformat and cleanup the entire file, deprecate NtVirtualLock/Unlock which didn't really work (and aren't really required for any apps for now) - Major perf optimizations to NtRead/VirtualMemory: Use pool memory transfer when more efficient than MDL, and use local stack buffer when size permits. -
by fireball@svn.reactos.org
Author: fireball Date: Thu Apr 24 16:26:01 2008 New Revision: 33133 URL:
http://svn.reactos.org/svn/reactos?rev=33133&view=rev
Log: - Rewrite NtRead/WriteVirtualMemory around MiCopyVirtualMemory, and use MmMapLockedPagesSpecifyCache to do the bulk of the work, instead of the MDL hacks that were previously used. - Reformat and cleanup the entire file, deprecate NtVirtualLock/Unlock which didn't really work (and aren't really required for any apps for now) - Major perf optimizations to NtRead/VirtualMemory: Use pool memory transfer when more efficient than MDL, and use local stack buffer when size permits. - This patch provides up to 109% improvement (more than twice as fast) in certain virtual memory operations. - Thanks to Alex for researching this issue, and providing the internal information on the various optimizations and behaviors the NT implementation uses. Modified: trunk/reactos/ntoskrnl/ex/exintrin.c trunk/reactos/ntoskrnl/mm/virtual.c Modified: trunk/reactos/ntoskrnl/ex/exintrin.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/exintrin.c?rev…
============================================================================== --- trunk/reactos/ntoskrnl/ex/exintrin.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/ex/exintrin.c [iso-8859-1] Thu Apr 24 16:26:01 2008 @@ -25,6 +25,9 @@ /* FUNCTIONS ******************************************************************/ +/* + * @implemented + */ LONG FASTCALL InterlockedIncrement(IN LONG volatile *Addend) @@ -35,6 +38,9 @@ return _InterlockedIncrement(Addend); } +/* + * @implemented + */ LONG FASTCALL InterlockedDecrement(IN LONG volatile *Addend) @@ -45,6 +51,9 @@ return _InterlockedDecrement(Addend); } +/* + * @implemented + */ LONG FASTCALL InterlockedCompareExchange(IN OUT LONG volatile *Destination, @@ -57,6 +66,9 @@ return _InterlockedCompareExchange(Destination, Exchange, Comperand); } +/* + * @implemented + */ LONG FASTCALL InterlockedExchange(IN OUT LONG volatile *Destination, @@ -68,6 +80,9 @@ return _InterlockedExchange(Destination, Value); } +/* + * @implemented + */ LONG FASTCALL InterlockedExchangeAdd(IN OUT LONG volatile *Addend, @@ -78,3 +93,89 @@ // return _InterlockedExchangeAdd(Addend, Increment); } + +/* + * @implemented + */ +VOID +NTAPI +ProbeForRead(IN CONST VOID *Address, + IN ULONG Length, + IN ULONG Alignment) +{ + PAGED_CODE(); + + /* Only probe if we have a valid length */ + if (Length != 0) + { + /* Sanity check */ + ASSERT((Alignment == 1) || + (Alignment == 2) || + (Alignment == 4) || + (Alignment == 8) || + (Alignment == 16)); + + /* Check for correct alignment */ + if (((ULONG_PTR)Address & (Alignment - 1)) != 0) + { + /* Incorrect alignment */ + ExRaiseDatatypeMisalignment(); + } + else if (((ULONG_PTR)Address + Length) < (ULONG_PTR)Address || + ((ULONG_PTR)Address + Length) > (ULONG_PTR)MmUserProbeAddress) + { + /* Attempt a read */ + *(volatile CHAR* const)MmUserProbeAddress = 0; + } + } +} + +/* + * @implemented + */ +VOID +NTAPI +ProbeForWrite(IN PVOID Address, + IN ULONG Length, + IN ULONG Alignment) +{ + ULONG_PTR Last, Current = (ULONG_PTR)Address; + PAGED_CODE(); + + /* Only probe if we have a valid length */ + if (Length != 0) + { + /* Sanity check */ + ASSERT((Alignment == 1) || + (Alignment == 2) || + (Alignment == 4) || + (Alignment == 8) || + (Alignment == 16)); + + /* Check the alignment */ + if ((Current & (Alignment - 1)) != 0) + { + /* Incorrect alignment */ + ExRaiseDatatypeMisalignment(); + } + + /* Get the end address */ + Last = Current + Length - 1; + if ((Last < Current) || (Last >= (ULONG_PTR)MmUserProbeAddress)) + { + /* Raise an access violation */ + ExRaiseAccessViolation(); + } + + /* Round down to the last page */ + Last = PAGE_ROUND_DOWN(Last) + PAGE_SIZE; + do + { + /* Attempt a write */ + *(volatile CHAR*)Current = *(volatile CHAR*)Current; + + /* Go to the next address */ + Current = PAGE_ROUND_DOWN(Current) + PAGE_SIZE; + } while (Current != Last); + } +} Modified: trunk/reactos/ntoskrnl/mm/virtual.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/mm/virtual.c?rev=…
============================================================================== --- trunk/reactos/ntoskrnl/mm/virtual.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/mm/virtual.c [iso-8859-1] Thu Apr 24 16:26:01 2008 @@ -7,107 +7,412 @@ * PROGRAMMERS: David Welch */ -/* INCLUDE *****************************************************************/ +/* INCLUDE ********************************************************************/ #include <ntoskrnl.h> - #define NDEBUG -#include <internal/debug.h> - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS STDCALL -NtFlushVirtualMemory(IN HANDLE ProcessHandle, - IN OUT PVOID *BaseAddress, - IN OUT PSIZE_T NumberOfBytesToFlush, - OUT PIO_STATUS_BLOCK IoStatusBlock) -/* - * FUNCTION: Flushes virtual memory to file - * ARGUMENTS: - * ProcessHandle = Points to the process that allocated the virtual - * memory - * BaseAddress = Points to the memory address - * NumberOfBytesToFlush = Limits the range to flush, - * NumberOfBytesFlushed = Actual number of bytes flushed - * RETURNS: Status - */ -{ - /* This should be implemented once we support network filesystems */ - DPRINT("NtFlushVirtualMemory is UNIMPLEMENTED\n"); - return(STATUS_SUCCESS); -} - - -NTSTATUS STDCALL -MiLockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToLock, - PULONG NumberOfBytesLocked, - PObReferenceObjectByHandle pObReferenceObjectByHandle, - PMmCreateMdl pMmCreateMdl, - PObDereferenceObject pObDereferenceObject, - PMmProbeAndLockPages pMmProbeAndLockPages, - PExFreePool pExFreePool) -{ - PEPROCESS Process; +#include <debug.h> + +#define MI_MAPPED_COPY_PAGES 16 +#define MI_POOL_COPY_BYTES 512 +#define MI_MAX_TRANSFER_SIZE 64 * 1024 +#define TAG_VM TAG('V', 'm', 'R', 'w') + +/* PRIVATE FUNCTIONS **********************************************************/ + +_SEH_DEFINE_LOCALS(MiGetExceptionInfo) +{ + volatile BOOLEAN HaveBadAddress; + volatile ULONG_PTR BadAddress; +}; + +_SEH_FILTER(MiGetExceptionInfo) +{ + _SEH_ACCESS_LOCALS(MiGetExceptionInfo); + EXCEPTION_POINTERS *ExceptionInfo = _SEH_GetExceptionPointers(); + PEXCEPTION_RECORD ExceptionRecord; + PAGED_CODE(); + + /* Assume default */ + _SEH_VAR(HaveBadAddress) = FALSE; + + /* Get the exception record */ + ExceptionRecord = ExceptionInfo->ExceptionRecord; + + /* Look at the exception code */ + if ((ExceptionRecord->ExceptionCode == STATUS_ACCESS_VIOLATION) || + (ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) || + (ExceptionRecord->ExceptionCode == STATUS_IN_PAGE_ERROR)) + { + /* We can tell the address if we have more than one parameter */ + if (ExceptionRecord->NumberParameters > 1) + { + /* Return the address */ + _SEH_VAR(HaveBadAddress) = TRUE; + _SEH_VAR(BadAddress) = ExceptionRecord->ExceptionInformation[1]; + } + } + + /* Continue executing the next handler */ + return EXCEPTION_EXECUTE_HANDLER; +} + +NTSTATUS +NTAPI +MiDoMappedCopy(IN PEPROCESS SourceProcess, + IN PVOID SourceAddress, + IN PEPROCESS TargetProcess, + OUT PVOID TargetAddress, + IN ULONG BufferSize, + IN KPROCESSOR_MODE PreviousMode, + OUT PULONG ReturnSize) +{ + PFN_NUMBER MdlBuffer[(sizeof(MDL) / sizeof(PFN_NUMBER)) + (MI_MAPPED_COPY_PAGES >> PAGE_SHIFT) + 1]; + PMDL Mdl = (PMDL)MdlBuffer; + ULONG TotalSize, CurrentSize, RemainingSize; + BOOLEAN FailedInProbe = FALSE, FailedInMapping = FALSE, FailedInMoving; + BOOLEAN PagesLocked; + PVOID CurrentAddress = SourceAddress, CurrentTargetAddress = TargetAddress; + PVOID MdlAddress; + KAPC_STATE ApcState; + _SEH_DECLARE_LOCALS(MiGetExceptionInfo); + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + /* Calculate the maximum amount of data to move */ + TotalSize = MI_MAPPED_COPY_PAGES - 2; + if (TotalSize <= (MI_MAPPED_COPY_PAGES - 2)) TotalSize = BufferSize; + CurrentSize = BufferSize; + RemainingSize = TotalSize; + + /* Loop as long as there is still data */ + while (RemainingSize > 0) + { + /* Check if this transfer will finish everything off */ + if (RemainingSize < CurrentSize) CurrentSize = RemainingSize; + + /* Attach to the source address space */ + KeStackAttachProcess(&SourceProcess->Pcb, &ApcState); + + /* Reset state for this pass */ + MdlAddress = NULL; + PagesLocked = FALSE; + FailedInMoving = FALSE; + ASSERT(FailedInProbe == FALSE); + + /* Protect user-mode copy */ + _SEH_TRY + { + /* If this is our first time, probe the buffer */ + if ((CurrentAddress == SourceAddress) && (PreviousMode != KernelMode)) + { + /* Catch a failure here */ + FailedInProbe = TRUE; + + /* Do the probe */ + ProbeForRead(SourceAddress, BufferSize, sizeof(CHAR)); + + /* Passed */ + FailedInProbe = FALSE; + } + + /* Initialize and probe and lock the MDL */ + MmInitializeMdl (Mdl, CurrentAddress, CurrentSize); + MmProbeAndLockPages (Mdl, PreviousMode, IoReadAccess); + PagesLocked = TRUE; + + /* Now map the pages */ + MdlAddress = MmMapLockedPagesSpecifyCache(Mdl, + KernelMode, + MmCached, + NULL, + FALSE, + HighPagePriority); + if (!MdlAddress) + { + /* Use our SEH handler to pick this up */ + FailedInMapping = TRUE; + ExRaiseStatus(STATUS_INSUFFICIENT_RESOURCES); + } + + /* Now let go of the source and grab to the target process */ + KeUnstackDetachProcess(&ApcState); + KeStackAttachProcess(&TargetProcess->Pcb, &ApcState); + + /* Check if this is our first time through */ + if ((CurrentAddress == SourceAddress) && (PreviousMode != KernelMode)) + { + /* Catch a failure here */ + FailedInProbe = TRUE; + + /* Do the probe */ + ProbeForWrite(TargetAddress, BufferSize, sizeof(CHAR)); + + /* Passed */ + FailedInProbe = FALSE; + } + + /* Now do the actual move */ + FailedInMoving = TRUE; + RtlCopyMemory(CurrentTargetAddress, MdlAddress, CurrentSize); + } + _SEH_EXCEPT(MiGetExceptionInfo) + { + /* Detach from whoever we may be attached to */ + KeUnstackDetachProcess(&ApcState); + + /* Check if we had mapped the pages */ + if (MdlAddress) MmUnmapLockedPages(MdlAddress, Mdl); + + /* Check if we had locked the pages */ + if (PagesLocked) MmUnlockPages(Mdl); + + /* Check if we failed during the probe or mapping */ + if ((FailedInProbe) || (FailedInMapping)) + { + /* Exit */ + Status = _SEH_GetExceptionCode(); + _SEH_YIELD(); + } + + /* Otherwise, we failed probably during the move */ + *ReturnSize = BufferSize - RemainingSize; + if (FailedInMoving) + { + /* Check if we know exactly where we stopped copying */ + if (_SEH_VAR(HaveBadAddress)) + { + /* Return the exact number of bytes copied */ + *ReturnSize = _SEH_VAR(BadAddress) - (ULONG_PTR)SourceAddress; + } + } + + /* Return partial copy */ + Status = STATUS_PARTIAL_COPY; + } + _SEH_END; + + /* Check for SEH status */ + if (Status != STATUS_SUCCESS) return Status; + + /* Detach from target */ + KeUnstackDetachProcess(&ApcState); + + /* Unmap and unlock */ + MmUnmapLockedPages(MdlAddress, Mdl); + MmUnlockPages(Mdl); + + /* Update location and size */ + RemainingSize -= CurrentSize; + CurrentAddress = (PVOID)((ULONG_PTR)CurrentAddress + CurrentSize); + CurrentTargetAddress = (PVOID)((ULONG_PTR)CurrentTargetAddress + CurrentSize); + } + + /* All bytes read */ + *ReturnSize = BufferSize; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MiDoPoolCopy(IN PEPROCESS SourceProcess, + IN PVOID SourceAddress, + IN PEPROCESS TargetProcess, + OUT PVOID TargetAddress, + IN ULONG BufferSize, + IN KPROCESSOR_MODE PreviousMode, + OUT PULONG ReturnSize) +{ + UCHAR StackBuffer[MI_POOL_COPY_BYTES]; + ULONG TotalSize, CurrentSize, RemainingSize; + BOOLEAN FailedInProbe = FALSE, FailedInMoving, HavePoolAddress = FALSE; + PVOID CurrentAddress = SourceAddress, CurrentTargetAddress = TargetAddress; + PVOID PoolAddress; + KAPC_STATE ApcState; + _SEH_DECLARE_LOCALS(MiGetExceptionInfo); + NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); + + /* Calculate the maximum amount of data to move */ + TotalSize = MI_MAX_TRANSFER_SIZE; + if (TotalSize <= MI_MAX_TRANSFER_SIZE) TotalSize = BufferSize; + CurrentSize = BufferSize; + RemainingSize = TotalSize; + + /* Check if we can use the stack */ + if (BufferSize <= MI_POOL_COPY_BYTES) + { + /* Use it */ + PoolAddress = (PVOID)StackBuffer; + } + else + { + /* Allocate pool */ + PoolAddress = ExAllocatePoolWithTag(NonPagedPool, TotalSize, TAG_VM); + if (!PoolAddress) ASSERT(FALSE); + HavePoolAddress = TRUE; + } + + /* Loop as long as there is still data */ + while (RemainingSize > 0) + { + /* Check if this transfer will finish everything off */ + if (RemainingSize < CurrentSize) CurrentSize = RemainingSize; + + /* Attach to the source address space */ + KeStackAttachProcess(&SourceProcess->Pcb, &ApcState); + + /* Reset state for this pass */ + FailedInMoving = FALSE; + ASSERT(FailedInProbe == FALSE); + + /* Protect user-mode copy */ + _SEH_TRY + { + /* If this is our first time, probe the buffer */ + if ((CurrentAddress == SourceAddress) && (PreviousMode != KernelMode)) + { + /* Catch a failure here */ + FailedInProbe = TRUE; + + /* Do the probe */ + ProbeForRead(SourceAddress, BufferSize, sizeof(CHAR)); + + /* Passed */ + FailedInProbe = FALSE; + } + + /* Do the copy */ + RtlCopyMemory(PoolAddress, CurrentAddress, CurrentSize); + + /* Now let go of the source and grab to the target process */ + KeUnstackDetachProcess(&ApcState); + KeStackAttachProcess(&TargetProcess->Pcb, &ApcState); + + /* Check if this is our first time through */ + if ((CurrentAddress == SourceAddress) && (PreviousMode != KernelMode)) + { + /* Catch a failure here */ + FailedInProbe = TRUE; + + /* Do the probe */ + ProbeForWrite(TargetAddress, BufferSize, sizeof(CHAR)); + + /* Passed */ + FailedInProbe = FALSE; + } + + /* Now do the actual move */ + FailedInMoving = TRUE; + RtlCopyMemory(CurrentTargetAddress, PoolAddress, CurrentSize); + } + _SEH_EXCEPT(MiGetExceptionInfo) + { + /* Detach from whoever we may be attached to */ + KeUnstackDetachProcess(&ApcState); + + /* Check if we had allocated pool */ + if (HavePoolAddress) ExFreePool(PoolAddress); + + /* Check if we failed during the probe */ + if (FailedInProbe) + { + /* Exit */ + Status = _SEH_GetExceptionCode(); + _SEH_YIELD(); + } + + /* Otherwise, we failed probably during the move */ + *ReturnSize = BufferSize - RemainingSize; + if (FailedInMoving) + { + /* Check if we know exactly where we stopped copying */ + if (_SEH_VAR(HaveBadAddress)) + { + /* Return the exact number of bytes copied */ + *ReturnSize = _SEH_VAR(BadAddress) - (ULONG_PTR)SourceAddress; + } + } + + /* Return partial copy */ + Status = STATUS_PARTIAL_COPY; + } + _SEH_END; + + /* Check for SEH status */ + if (Status != STATUS_SUCCESS) return Status; + + /* Detach from target */ + KeUnstackDetachProcess(&ApcState); + + /* Update location and size */ + RemainingSize -= CurrentSize; + CurrentAddress = (PVOID)((ULONG_PTR)CurrentAddress + CurrentSize); + CurrentTargetAddress = (PVOID)((ULONG_PTR)CurrentTargetAddress + CurrentSize); + } + + /* Check if we had allocated pool */ + if (HavePoolAddress) ExFreePool(PoolAddress); + + /* All bytes read */ + *ReturnSize = BufferSize; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +MmCopyVirtualMemory(IN PEPROCESS SourceProcess, + IN PVOID SourceAddress, + IN PEPROCESS TargetProcess, + OUT PVOID TargetAddress, + IN ULONG BufferSize, + IN KPROCESSOR_MODE PreviousMode, + OUT PULONG ReturnSize) +{ NTSTATUS Status; - PMDL Mdl; - - Status = pObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - return(Status); - - Mdl = pMmCreateMdl(NULL, - BaseAddress, - NumberOfBytesToLock); - if (Mdl == NULL) - { - pObDereferenceObject(Process); - return(STATUS_NO_MEMORY); - } - - pMmProbeAndLockPages(Mdl, - UserMode, - IoWriteAccess); - - pExFreePool(Mdl); - - pObDereferenceObject(Process); - - *NumberOfBytesLocked = NumberOfBytesToLock; - return(STATUS_SUCCESS); -} - - -NTSTATUS STDCALL -NtLockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToLock, - PULONG NumberOfBytesLocked) -{ - DPRINT("NtLockVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "NumberOfBytesToLock %d, NumberOfBytesLocked %x)\n", - ProcessHandle, - BaseAddress, - NumberOfBytesToLock, - NumberOfBytesLocked); - - return MiLockVirtualMemory(ProcessHandle, - BaseAddress, - NumberOfBytesToLock, - NumberOfBytesLocked, - ObReferenceObjectByHandle, - MmCreateMdl, - (PVOID)ObfDereferenceObject, - MmProbeAndLockPages, - ExFreePool); -} - + PEPROCESS Process = SourceProcess; + + /* Don't accept zero-sized buffers */ + if (!BufferSize) return STATUS_SUCCESS; + + /* If we are copying from ourselves, lock the target instead */ + if (SourceProcess == PsGetCurrentProcess()) Process = TargetProcess; + + /* Acquire rundown protection */ + if (!ExAcquireRundownProtection(&Process->RundownProtect)) + { + /* Fail */ + return STATUS_PROCESS_IS_TERMINATING; + } + + /* See if we should use the pool copy */ + if (BufferSize > MI_POOL_COPY_BYTES) + { + /* Use MDL-copy */ + Status = MiDoMappedCopy(SourceProcess, + SourceAddress, + TargetProcess, + TargetAddress, + BufferSize, + PreviousMode, + ReturnSize); + } + else + { + /* Do pool copy */ + Status = MiDoPoolCopy(SourceProcess, + SourceAddress, + TargetProcess, + TargetAddress, + BufferSize, + PreviousMode, + ReturnSize); + } + + /* Release the lock */ + ExReleaseRundownProtection(&Process->RundownProtect); + return Status; +} NTSTATUS FASTCALL MiQueryVirtualMemory(IN HANDLE ProcessHandle, @@ -276,11 +581,370 @@ return Status; } -/* (tMk 2004.II.4) - * FUNCTION: - * Called from VirtualQueryEx (lib\kernel32\mem\virtual.c) - * +NTSTATUS STDCALL +MiProtectVirtualMemory(IN PEPROCESS Process, + IN OUT PVOID *BaseAddress, + IN OUT PULONG NumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG OldAccessProtection OPTIONAL) +{ + PMEMORY_AREA MemoryArea; + PMADDRESS_SPACE AddressSpace; + ULONG OldAccessProtection_; + NTSTATUS Status; + + *NumberOfBytesToProtect = + PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) - + PAGE_ROUND_DOWN(*BaseAddress); + *BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress); + + AddressSpace = (PMADDRESS_SPACE)&(Process)->VadRoot; + + MmLockAddressSpace(AddressSpace); + MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress); + if (MemoryArea == NULL) + { + MmUnlockAddressSpace(AddressSpace); + return STATUS_UNSUCCESSFUL; + } + + if (OldAccessProtection == NULL) + OldAccessProtection = &OldAccessProtection_; + + if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) + { + Status = MmProtectAnonMem(AddressSpace, MemoryArea, *BaseAddress, + *NumberOfBytesToProtect, NewAccessProtection, + OldAccessProtection); + } + else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) + { + Status = MmProtectSectionView(AddressSpace, MemoryArea, *BaseAddress, + *NumberOfBytesToProtect, + NewAccessProtection, + OldAccessProtection); + } + else + { + /* FIXME: Should we return failure or success in this case? */ + Status = STATUS_CONFLICTING_ADDRESSES; + } + + MmUnlockAddressSpace(AddressSpace); + + return Status; +} + +/* PUBLIC FUNCTIONS ***********************************************************/ + +/* + * @unimplemented */ +PVOID +NTAPI +MmGetVirtualForPhysical(IN PHYSICAL_ADDRESS PhysicalAddress) +{ + UNIMPLEMENTED; + return 0; +} + +/* + * @unimplemented + */ +PVOID +NTAPI +MmSecureVirtualMemory(IN PVOID Address, + IN SIZE_T Length, + IN ULONG Mode) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + * @unimplemented + */ +VOID +NTAPI +MmUnsecureVirtualMemory(IN PVOID SecureMem) +{ + UNIMPLEMENTED; +} + +/* SYSTEM CALLS ***************************************************************/ + +NTSTATUS +NTAPI +NtReadVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + OUT PVOID Buffer, + IN ULONG NumberOfBytesToRead, + OUT PULONG NumberOfBytesRead OPTIONAL) +{ + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + PEPROCESS Process; + NTSTATUS Status = STATUS_SUCCESS; + ULONG BytesRead = 0; + PAGED_CODE(); + + /* Check if we came from user mode */ + if (PreviousMode != KernelMode) + { + /* Validate the read addresses */ + if ((((ULONG_PTR)BaseAddress + NumberOfBytesToRead) < (ULONG_PTR)BaseAddress) || + (((ULONG_PTR)Buffer + NumberOfBytesToRead) < (ULONG_PTR)Buffer) || + (((ULONG_PTR)BaseAddress + NumberOfBytesToRead) > MmUserProbeAddress) || + (((ULONG_PTR)Buffer + NumberOfBytesToRead) > MmUserProbeAddress)) + { + /* Don't allow to write into kernel space */ + return STATUS_ACCESS_VIOLATION; + } + + /* Enter SEH for probe */ + _SEH_TRY + { + /* Probe the output value */ + if (NumberOfBytesRead) ProbeForWriteUlong(NumberOfBytesRead); + } + _SEH_HANDLE + { + /* Get exception code */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + /* Return if we failed */ + if (!NT_SUCCESS(Status)) return Status; + } + + /* Reference the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_READ, + PsProcessType, + PreviousMode, + (PVOID*)(&Process), + NULL); + if (NT_SUCCESS(Status)) + { + /* Do the copy */ + Status = MmCopyVirtualMemory(Process, + BaseAddress, + PsGetCurrentProcess(), + Buffer, + NumberOfBytesToRead, + PreviousMode, + &BytesRead); + + /* Derefernece the process */ + ObDereferenceObject(Process); + } + + /* Check if the caller sent this parameter */ + if (NumberOfBytesRead) + { + /* Enter SEH to guard write */ + _SEH_TRY + { + /* Return the number of bytes read */ + *NumberOfBytesRead = BytesRead; + } + _SEH_HANDLE + { + /* Handle exception */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } + + /* Return status */ + return Status; +} + +NTSTATUS +NTAPI +NtWriteVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN PVOID Buffer, + IN ULONG NumberOfBytesToWrite, + OUT PULONG NumberOfBytesWritten OPTIONAL) +{ + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + PEPROCESS Process; + NTSTATUS Status = STATUS_SUCCESS; + ULONG BytesWritten = 0; + PAGED_CODE(); + + /* Check if we came from user mode */ + if (PreviousMode != KernelMode) + { + /* Validate the read addresses */ + if ((((ULONG_PTR)BaseAddress + NumberOfBytesToWrite) < (ULONG_PTR)BaseAddress) || + (((ULONG_PTR)Buffer + NumberOfBytesToWrite) < (ULONG_PTR)Buffer) || + (((ULONG_PTR)BaseAddress + NumberOfBytesToWrite) > MmUserProbeAddress) || + (((ULONG_PTR)Buffer + NumberOfBytesToWrite) > MmUserProbeAddress)) + { + /* Don't allow to write into kernel space */ + return STATUS_ACCESS_VIOLATION; + } + + /* Enter SEH for probe */ + _SEH_TRY + { + /* Probe the output value */ + if (NumberOfBytesWritten) ProbeForWriteUlong(NumberOfBytesWritten); + } + _SEH_HANDLE + { + /* Get exception code */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + /* Return if we failed */ + if (!NT_SUCCESS(Status)) return Status; + } + + /* Reference the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_WRITE, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (NT_SUCCESS(Status)) + { + /* Do the copy */ + Status = MmCopyVirtualMemory(PsGetCurrentProcess(), + Buffer, + Process, + BaseAddress, + NumberOfBytesToWrite, + PreviousMode, + &BytesWritten); + + /* Derefernece the process */ + ObDereferenceObject(Process); + } + + /* Check if the caller sent this parameter */ + if (NumberOfBytesWritten) + { + /* Enter SEH to guard write */ + _SEH_TRY + { + /* Return the number of bytes read */ + *NumberOfBytesWritten = BytesWritten; + } + _SEH_HANDLE + { + /* Handle exception */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } + + /* Return status */ + return Status; +} + +NTSTATUS +NTAPI +NtProtectVirtualMemory(IN HANDLE ProcessHandle, + IN OUT PVOID *UnsafeBaseAddress, + IN OUT ULONG *UnsafeNumberOfBytesToProtect, + IN ULONG NewAccessProtection, + OUT PULONG UnsafeOldAccessProtection) +{ + PEPROCESS Process; + ULONG OldAccessProtection; + PVOID BaseAddress = NULL; + ULONG NumberOfBytesToProtect = 0; + KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); + NTSTATUS Status = STATUS_SUCCESS; + + /* Check if we came from user mode */ + if (PreviousMode != KernelMode) + { + /* Enter SEH for probing */ + _SEH_TRY + { + /* Validate all outputs */ + ProbeForWritePointer(UnsafeBaseAddress); + ProbeForWriteUlong(UnsafeNumberOfBytesToProtect); + ProbeForWriteUlong(UnsafeOldAccessProtection); + + /* Capture them */ + BaseAddress = *UnsafeBaseAddress; + NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect; + } + _SEH_HANDLE + { + /* Get exception code */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + /* Return on exception */ + if (!NT_SUCCESS(Status)) return Status; + } + else + { + /* Capture directly */ + BaseAddress = *UnsafeBaseAddress; + NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect; + } + + /* Catch illegal base address */ + if (BaseAddress > (PVOID)MmUserProbeAddress) return STATUS_INVALID_PARAMETER_2; + + /* Catch illegal region size */ + if ((MmUserProbeAddress - (ULONG_PTR)BaseAddress) < NumberOfBytesToProtect) + { + /* Fail */ + return STATUS_INVALID_PARAMETER_3; + } + + /* 0 is also illegal */ + if (!NumberOfBytesToProtect) return STATUS_INVALID_PARAMETER_3; + + /* Get a reference to the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_VM_OPERATION, + PsProcessType, + PreviousMode, + (PVOID*)(&Process), + NULL); + if (!NT_SUCCESS(Status)) return Status; + + /* Do the actual work */ + Status = MiProtectVirtualMemory(Process, + &BaseAddress, + &NumberOfBytesToProtect, + NewAccessProtection, + &OldAccessProtection); + + /* Release reference */ + ObDereferenceObject(Process); + + /* Enter SEH to return data */ + _SEH_TRY + { + /* Return data to user */ + *UnsafeOldAccessProtection = OldAccessProtection; + *UnsafeBaseAddress = BaseAddress; + *UnsafeNumberOfBytesToProtect = NumberOfBytesToProtect; + } + _SEH_HANDLE + { + /* Catch exception */ + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + /* Return status */ + return Status; +} + NTSTATUS STDCALL NtQueryVirtualMemory(IN HANDLE ProcessHandle, IN PVOID Address, @@ -297,15 +961,15 @@ MEMORY_BASIC_INFORMATION BasicInfo; } VirtualMemoryInfo; - + DPRINT("NtQueryVirtualMemory(ProcessHandle %x, Address %x, " "VirtualMemoryInformationClass %d, VirtualMemoryInformation %x, " "Length %lu ResultLength %x)\n",ProcessHandle,Address, VirtualMemoryInformationClass,VirtualMemoryInformation, Length,ResultLength); - + PreviousMode = ExGetPreviousMode(); - + if (PreviousMode != KernelMode && UnsafeResultLength != NULL) { _SEH_TRY @@ -317,26 +981,26 @@ Status = _SEH_GetExceptionCode(); } _SEH_END; - + if (!NT_SUCCESS(Status)) { return Status; } } - + if (Address >= MmSystemRangeStart) { DPRINT1("Invalid parameter\n"); return STATUS_INVALID_PARAMETER; } - + Status = MiQueryVirtualMemory(ProcessHandle, Address, VirtualMemoryInformationClass, &VirtualMemoryInfo, Length, &ResultLength ); - + if (NT_SUCCESS(Status)) { if (PreviousMode != KernelMode) @@ -371,687 +1035,50 @@ &VirtualMemoryInfo, ResultLength); } - + if (UnsafeResultLength != NULL) { *UnsafeResultLength = ResultLength; } } } - - return(Status); -} - - -NTSTATUS STDCALL -MiProtectVirtualMemory(IN PEPROCESS Process, - IN OUT PVOID *BaseAddress, - IN OUT PULONG NumberOfBytesToProtect, - IN ULONG NewAccessProtection, - OUT PULONG OldAccessProtection OPTIONAL) -{ - PMEMORY_AREA MemoryArea; - PMADDRESS_SPACE AddressSpace; - ULONG OldAccessProtection_; - NTSTATUS Status; - - *NumberOfBytesToProtect = - PAGE_ROUND_UP((ULONG_PTR)(*BaseAddress) + (*NumberOfBytesToProtect)) - - PAGE_ROUND_DOWN(*BaseAddress); - *BaseAddress = (PVOID)PAGE_ROUND_DOWN(*BaseAddress); - - AddressSpace = (PMADDRESS_SPACE)&(Process)->VadRoot; - - MmLockAddressSpace(AddressSpace); - MemoryArea = MmLocateMemoryAreaByAddress(AddressSpace, *BaseAddress); - if (MemoryArea == NULL) - { - MmUnlockAddressSpace(AddressSpace); - return STATUS_UNSUCCESSFUL; - } - - if (OldAccessProtection == NULL) - OldAccessProtection = &OldAccessProtection_; - - if (MemoryArea->Type == MEMORY_AREA_VIRTUAL_MEMORY) - { - Status = MmProtectAnonMem(AddressSpace, MemoryArea, *BaseAddress, - *NumberOfBytesToProtect, NewAccessProtection, - OldAccessProtection); - } - else if (MemoryArea->Type == MEMORY_AREA_SECTION_VIEW) - { - Status = MmProtectSectionView(AddressSpace, MemoryArea, *BaseAddress, - *NumberOfBytesToProtect, - NewAccessProtection, - OldAccessProtection); - } - else - { - /* FIXME: Should we return failure or success in this case? */ - Status = STATUS_CONFLICTING_ADDRESSES; - } - - MmUnlockAddressSpace(AddressSpace); - - return Status; -} - - -/* (tMk 2004.II.5) - * FUNCTION: - * Called from VirtualProtectEx (lib\kernel32\mem\virtual.c) - * - */ -NTSTATUS STDCALL -NtProtectVirtualMemory(IN HANDLE ProcessHandle, - IN OUT PVOID *UnsafeBaseAddress, - IN OUT ULONG *UnsafeNumberOfBytesToProtect, - IN ULONG NewAccessProtection, - OUT PULONG UnsafeOldAccessProtection) -{ - PEPROCESS Process; - ULONG OldAccessProtection; - PVOID BaseAddress = NULL; - ULONG NumberOfBytesToProtect = 0; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status = STATUS_SUCCESS; - - PreviousMode = ExGetPreviousMode(); - - if (PreviousMode != KernelMode) - { - _SEH_TRY - { - ProbeForWritePointer(UnsafeBaseAddress); - ProbeForWriteUlong(UnsafeNumberOfBytesToProtect); - ProbeForWriteUlong(UnsafeOldAccessProtection); - - BaseAddress = *UnsafeBaseAddress; - NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - else - { - BaseAddress = *UnsafeBaseAddress; - NumberOfBytesToProtect = *UnsafeNumberOfBytesToProtect; - } - - if ((ULONG_PTR)BaseAddress + NumberOfBytesToProtect - 1 < (ULONG_PTR)BaseAddress || - (ULONG_PTR)BaseAddress + NumberOfBytesToProtect - 1 >= MmUserProbeAddress) - { - /* Don't allow to change the protection of a kernel mode address */ - return STATUS_INVALID_PARAMETER_2; - } - - /* (tMk 2004.II.5) in Microsoft SDK I read: - * 'if this parameter is NULL or does not point to a valid variable, the function fails' - */ - if(UnsafeOldAccessProtection == NULL) - { - return(STATUS_INVALID_PARAMETER); - } - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_OPERATION, - PsProcessType, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - DPRINT("NtProtectVirtualMemory() = %x\n",Status); - return(Status); - } - - Status = MiProtectVirtualMemory(Process, - &BaseAddress, - &NumberOfBytesToProtect, - NewAccessProtection, - &OldAccessProtection); - - ObDereferenceObject(Process); - - if (PreviousMode != KernelMode) - { - _SEH_TRY - { - *UnsafeOldAccessProtection = OldAccessProtection; - *UnsafeBaseAddress = BaseAddress; - *UnsafeNumberOfBytesToProtect = NumberOfBytesToProtect; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - else - { - *UnsafeOldAccessProtection = OldAccessProtection; - *UnsafeBaseAddress = BaseAddress; - *UnsafeNumberOfBytesToProtect = NumberOfBytesToProtect; - } - + return(Status); } - -/* (tMk 2004.II.05) - * FUNCTION: - * Called from ReadProcessMemory (lib\kernel32\mem\procmem.c) and KlInitPeb(lib\kernel32\process\create.c) - * - * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. - */ -NTSTATUS STDCALL -NtReadVirtualMemory(IN HANDLE ProcessHandle, +NTSTATUS +NTAPI +NtLockVirtualMemory(IN HANDLE ProcessHandle, IN PVOID BaseAddress, - OUT PVOID Buffer, - IN ULONG NumberOfBytesToRead, - OUT PULONG NumberOfBytesRead OPTIONAL) -{ - PMDL Mdl; - PVOID SystemAddress; - KPROCESSOR_MODE PreviousMode; - PEPROCESS Process, CurrentProcess; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - DPRINT("NtReadVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "Buffer %x, NumberOfBytesToRead %d)\n",ProcessHandle,BaseAddress, - Buffer,NumberOfBytesToRead); - - if ((ULONG_PTR)BaseAddress + NumberOfBytesToRead - 1 < (ULONG_PTR)BaseAddress || - (ULONG_PTR)BaseAddress + NumberOfBytesToRead - 1 >= MmUserProbeAddress) - { - /* Don't allow to read from kernel space */ - return STATUS_ACCESS_VIOLATION; - } - - PreviousMode = ExGetPreviousMode(); - - if (PreviousMode != KernelMode) - { - if ((ULONG_PTR)Buffer + NumberOfBytesToRead - 1 < (ULONG_PTR)Buffer || - (ULONG_PTR)Buffer + NumberOfBytesToRead - 1 >= MmUserProbeAddress) - { - /* Don't allow to write into kernel space */ - return STATUS_ACCESS_VIOLATION; - } - } - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_READ, - NULL, - PreviousMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - CurrentProcess = PsGetCurrentProcess(); - - if(PreviousMode != KernelMode) - { - _SEH_TRY - { - if(NumberOfBytesRead != NULL) - { - ProbeForWriteUlong(NumberOfBytesRead); - } - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if(!NT_SUCCESS(Status)) - { - return Status; - } - } - - - if (Process == CurrentProcess) - { - _SEH_TRY - { - RtlCopyMemory(Buffer, BaseAddress, NumberOfBytesToRead); - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - else - { - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToRead); - if(Mdl == NULL) - { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); - } - - _SEH_TRY - { - MmProbeAndLockPages(Mdl, PreviousMode, IoWriteAccess); - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if(NT_SUCCESS(Status)) - { - KeAttachProcess(&Process->Pcb); - - SystemAddress = MmGetSystemAddressForMdl(Mdl); - - Status = STATUS_SUCCESS; - _SEH_TRY - { - Status = STATUS_PARTIAL_COPY; - RtlCopyMemory(SystemAddress, BaseAddress, NumberOfBytesToRead); - Status = STATUS_SUCCESS; - } - _SEH_HANDLE - { - if(Status != STATUS_PARTIAL_COPY) - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - KeDetachProcess(); - - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - } - ExFreePool(Mdl); - } - - ObDereferenceObject(Process); - - if ((NT_SUCCESS(Status) || Status == STATUS_PARTIAL_COPY) && - NumberOfBytesRead != NULL) - { - _SEH_TRY - { - *NumberOfBytesRead = NumberOfBytesToRead; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - - return(Status); -} - -/* (tMk 2004.II.05) - * FUNCTION: THIS function doesn't make a sense... - * Called from VirtualUnlock (lib\kernel32\mem\virtual.c) - */ -NTSTATUS STDCALL -NtUnlockVirtualMemory(HANDLE ProcessHandle, - PVOID BaseAddress, - ULONG NumberOfBytesToUnlock, - PULONG NumberOfBytesUnlocked OPTIONAL) -{ - // AG [08-20-03] : I have *no* idea if this is correct, I just used the - // other functions as a template and made a few intelligent guesses... - - NTSTATUS Status; - PMDL Mdl; - PEPROCESS Process; - - DPRINT("NtUnlockVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "NumberOfBytesToUnlock %d), NumberOfBytesUnlocked %x\n",ProcessHandle,BaseAddress, - NumberOfBytesToUnlock, NumberOfBytesUnlocked); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - Mdl = MmCreateMdl(NULL, - BaseAddress, - NumberOfBytesToUnlock); - if(Mdl == NULL) - { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); - } - - ObDereferenceObject(Process); - - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - ExFreePool(Mdl); - - *NumberOfBytesUnlocked = NumberOfBytesToUnlock; - - return(STATUS_SUCCESS); -} - - -/* (tMk 2004.II.05) - * FUNCTION: - * Called from WriteProcessMemory (lib\kernel32\mem\procmem.c) and KlInitPeb(lib\kernel32\process\create.c) - * - * NOTE: This function will be correct if MmProbeAndLockPages() would be fully IMPLEMENTED. - */ -NTSTATUS STDCALL -NtWriteVirtualMemory(IN HANDLE ProcessHandle, - IN PVOID BaseAddress, - IN PVOID Buffer, - IN ULONG NumberOfBytesToWrite, - OUT PULONG NumberOfBytesWritten OPTIONAL) -{ - PMDL Mdl; - PVOID SystemAddress; - PEPROCESS Process; - KPROCESSOR_MODE PreviousMode; - NTSTATUS CopyStatus, Status = STATUS_SUCCESS; - - DPRINT("NtWriteVirtualMemory(ProcessHandle %x, BaseAddress %x, " - "Buffer %x, NumberOfBytesToWrite %d)\n",ProcessHandle,BaseAddress, - Buffer,NumberOfBytesToWrite); - - if ((ULONG_PTR)BaseAddress + NumberOfBytesToWrite - 1 < (ULONG_PTR)BaseAddress || - (ULONG_PTR)BaseAddress + NumberOfBytesToWrite - 1 >= MmUserProbeAddress) - { - /* Don't allow to write into kernel space */ - return STATUS_ACCESS_VIOLATION; - } - - PreviousMode = ExGetPreviousMode(); - - if (PreviousMode != KernelMode) - { - if ((ULONG_PTR)Buffer + NumberOfBytesToWrite - 1 < (ULONG_PTR)Buffer || - (ULONG_PTR)Buffer + NumberOfBytesToWrite - 1 >= MmUserProbeAddress) - { - /* Don't allow to read from kernel space */ - return STATUS_ACCESS_VIOLATION; - } - if (NumberOfBytesWritten != NULL) - { - _SEH_TRY - { - ProbeForWriteUlong(NumberOfBytesWritten); - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (!NT_SUCCESS(Status)) - { - return Status; - } - } - } - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_VM_WRITE, - NULL, - UserMode, - (PVOID*)(&Process), - NULL); - if (!NT_SUCCESS(Status)) - { - return(Status); - } - - CopyStatus = STATUS_SUCCESS; - - /* Write memory */ - if (Process == PsGetCurrentProcess()) - { - if (PreviousMode != KernelMode) - { - _SEH_TRY - { - memcpy(BaseAddress, Buffer, NumberOfBytesToWrite); - } - _SEH_HANDLE - { - CopyStatus = _SEH_GetExceptionCode(); - } - _SEH_END; - } - else - { - memcpy(BaseAddress, Buffer, NumberOfBytesToWrite); - } - } - else - { - /* Create MDL describing the source buffer. */ - Mdl = MmCreateMdl(NULL, - Buffer, - NumberOfBytesToWrite); - if (Mdl == NULL) - { - ObDereferenceObject(Process); - return(STATUS_NO_MEMORY); - } - _SEH_TRY - { - /* Map the MDL. */ - MmProbeAndLockPages(Mdl, UserMode, IoReadAccess); - } - _SEH_HANDLE - { - CopyStatus = _SEH_GetExceptionCode(); - } - _SEH_END; - - if (NT_SUCCESS(CopyStatus)) - { - /* Copy memory from the mapped MDL into the target buffer. */ - KeAttachProcess(&Process->Pcb); - - SystemAddress = MmGetSystemAddressForMdl(Mdl); - if (PreviousMode != KernelMode) - { - _SEH_TRY - { - memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); - } - _SEH_HANDLE - { - CopyStatus = _SEH_GetExceptionCode(); - } - _SEH_END; - } - else - { - memcpy(BaseAddress, SystemAddress, NumberOfBytesToWrite); - } - - KeDetachProcess(); - } - - /* Free the MDL. */ - if (Mdl->MappedSystemVa != NULL) - { - MmUnmapLockedPages(Mdl->MappedSystemVa, Mdl); - } - MmUnlockPages(Mdl); - ExFreePool(Mdl); - } - ObDereferenceObject(Process); - - if (NT_SUCCESS(CopyStatus) && NumberOfBytesWritten != NULL) - { - if (PreviousMode != KernelMode) - { - _SEH_TRY - { - *NumberOfBytesWritten = NumberOfBytesToWrite; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - else - { - *NumberOfBytesWritten = NumberOfBytesToWrite; - } - } - - return(NT_SUCCESS(CopyStatus) ? Status : CopyStatus); -} - -/* - * @unimplemented - */ - -PVOID -STDCALL -MmGetVirtualForPhysical( - IN PHYSICAL_ADDRESS PhysicalAddress - ) + IN ULONG NumberOfBytesToLock, + OUT PULONG NumberOfBytesLocked OPTIONAL) { UNIMPLEMENTED; - return 0; -} - -/* FUNCTION: - * Called from EngSecureMem (subsys\win32k\eng\mem.c) - * @unimplemented - */ -PVOID STDCALL -MmSecureVirtualMemory(PVOID Address, - SIZE_T Length, - ULONG Mode) -{ - /* Only works for user space */ - if (((ULONG_PTR)Address >= (ULONG_PTR)Address + Length) || - ((ULONG_PTR)MmHighestUserAddress < (ULONG_PTR)Address + Length)) - { - return NULL; - } - + if (NumberOfBytesLocked) *NumberOfBytesLocked = 0; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +NtUnlockVirtualMemory(IN HANDLE ProcessHandle, + IN PVOID BaseAddress, + IN ULONG NumberOfBytesToUnlock, + OUT PULONG NumberOfBytesUnlocked OPTIONAL) +{ UNIMPLEMENTED; - - return 0; -} - - -/* FUNCTION: - * Called from EngUnsecureMem (subsys\win32k\eng\mem.c) - * @unimplemented - */ -VOID STDCALL -MmUnsecureVirtualMemory(PVOID SecureMem) -{ - if (NULL == SecureMem) - { - return; - } - + if (NumberOfBytesUnlocked) *NumberOfBytesUnlocked = 0; + return STATUS_SUCCESS; +} + +NTSTATUS +NTAPI +NtFlushVirtualMemory(IN HANDLE ProcessHandle, + IN OUT PVOID *BaseAddress, + IN OUT PSIZE_T NumberOfBytesToFlush, + OUT PIO_STATUS_BLOCK IoStatusBlock) +{ UNIMPLEMENTED; -} - - -/* - * @implemented - */ -VOID STDCALL -ProbeForRead(IN CONST VOID *Address, - IN ULONG Length, - IN ULONG Alignment) -{ - if (Length != 0) - { - ASSERT(Alignment == 1 || Alignment == 2 || Alignment == 4 || Alignment == 8); - - if (((ULONG_PTR)Address & (Alignment - 1)) != 0) - { - ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT); - } - else if ((ULONG_PTR)Address + Length - 1 < (ULONG_PTR)Address || - (ULONG_PTR)Address + Length - 1 >= (ULONG_PTR)MmUserProbeAddress) - { - ExRaiseStatus (STATUS_ACCESS_VIOLATION); - } - } -} - - -/* - * @implemented - */ -VOID STDCALL -ProbeForWrite(IN PVOID Address, - IN ULONG Length, - IN ULONG Alignment) -{ - volatile CHAR *Current; - PCHAR Last; - - if (Length != 0) - { - ASSERT(Alignment == 1 || Alignment == 2 || Alignment == 4 || Alignment == 8); - - if (((ULONG_PTR)Address & (Alignment - 1)) != 0) - { - ExRaiseStatus (STATUS_DATATYPE_MISALIGNMENT); - } - - Last = (PCHAR)((ULONG_PTR)Address + Length - 1); - if ((ULONG_PTR)Last < (ULONG_PTR)Address || - (ULONG_PTR)Last >= (ULONG_PTR)MmUserProbeAddress) - { - ExRaiseStatus (STATUS_ACCESS_VIOLATION); - } - - /* Check for accessible pages, do *not* touch any memory outside of the - range!*/ - Current = (volatile CHAR*)Address; - Last = (PCHAR)(PAGE_ROUND_DOWN(Last)); - do - { - *Current = *Current; - Current = (volatile CHAR*)(PAGE_ROUND_DOWN(Current) + PAGE_SIZE); - } while (Current <= Last); - } + return STATUS_SUCCESS; } /* EOF */
16 years, 8 months
1
0
0
0
[gbrunmar] 33132: Added some work-in-progress structs needed for IDirect3D9::CreateDevice()
by gbrunmar@svn.reactos.org
Author: gbrunmar Date: Thu Apr 24 14:57:41 2008 New Revision: 33132 URL:
http://svn.reactos.org/svn/reactos?rev=33132&view=rev
Log: Added some work-in-progress structs needed for IDirect3D9::CreateDevice() Added: trunk/reactos/dll/directx/d3d9/d3d9_device.h (with props) Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h Added: trunk/reactos/dll/directx/d3d9/d3d9_device.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_devi…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_device.h (added) +++ trunk/reactos/dll/directx/d3d9/d3d9_device.h [iso-8859-1] Thu Apr 24 14:57:41 2008 @@ -1,0 +1,1584 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS ReactX + * FILE: dll/directx/d3d9/d3d9_device.h + * PURPOSE: d3d9.dll internal device structures + * PROGRAMERS: Gregor Brunmar <gregor (dot) brunmar (at) home (dot) se> + */ +#ifndef _D3D9_DEVICE_H_ +#define _D3D9_DEVICE_H_ + +#include "d3d9_common.h" +#include <d3d9.h> +#include "d3d9_private.h" + +enum REF_TYPE +{ + RT_EXTERNAL, + RT_BUILTIN, + RT_INTERNAL, +}; + +typedef struct _tagD3D9BaseObject_ +{ +/* 0x0000 */ LPDWORD lpVtbl; +/* 0x0004 */ DWORD dwUnknown0004; +/* 0x0008 */ DWORD dwUnknown0008; +/* 0x000c */ struct _tagD3D9BaseDevice_* pBaseDevice; +/* 0x0010 */ DWORD dwUnknown0010; // Index? Unique id? +/* 0x0014 */ HANDLE hKernelHandle; +/* 0x0018 */ LPDWORD dwUnknown0018; +/* 0x001c */ enum REF_TYPE RefType; +} D3D9BaseObject; + +typedef struct _tagD3D9BaseSurface_ +{ +/* 0x0000 */ LPDWORD lpVtbl; +/* 0x0024 */ D3DFORMAT DisplayFormat2; +/* 0x0028 */ DWORD dwUnknown0028; // Constant/ref count? (1) +/* 0x002c */ DWORD dwUnknown002c; // Refresh rate? +/* 0x0030 */ D3DPOOL SurfacePool; +/* 0x0034 */ DWORD dwUnknown0034; +/* 0x0038 */ DWORD dwUnknown0038; +/* 0x003c */ DWORD dwWidth; +/* 0x0040 */ DWORD dwHeight; +/* 0x0044 */ D3DPOOL ResourcePool; +/* 0x0048 */ D3DFORMAT DisplayFormat; +/* 0x004c */ DWORD dwUnknown004c; +/* 0x0050 */ DWORD dwUnknown0050; +/* 0x0054 */ DWORD dwUnknown0054; +/* 0x0058 */ DWORD dwBpp; +} D3D9BaseSurface; + +typedef struct _tagD3D9Surface_ +{ +/* 0x0000 */ D3D9BaseObject BaseObject; +/* 0x0020 */ D3D9BaseSurface BaseSurface; +} D3D9Surface; + +typedef struct _tagD3D9DriverSurface_ +{ +/* 0x0000 */ D3D9Surface BaseD3D9Surface; +/* 0x005c */ DWORD dwUnknown5c; +/* 0x0060 */ DWORD dwUnknown60; +/* 0x0064 */ struct _tagD3D9DriverSurface_* pPreviousDriverSurface; +/* 0x0068 */ struct _tagD3D9DriverSurface_* pNextDriverSurface; +/* 0x006c */ DWORD dwUnknown6c[8]; +} D3D9DriverSurface; + +typedef struct _tagD3D9TextureHeap_ +{ +/* 0x0000 */ DWORD NumTextures; +/* 0x0004 */ LPDWORD pFirstTexture; +} D3D9TextureHeap; + +typedef struct _tagD3D9ResourceManager_ +{ +#ifdef D3D_DEBUG_INFO +/* N/A - 0x0000 */ DDSURFACEDESC SurfaceDesc[8]; +#endif +/* 0x0000 - 0x0160 */ struct _tagD3D9BaseDevice_* pBaseDevice; +/* 0x0004 - 0x0164 */ DWORD dwUnknown0004; +/* 0x0008 - 0x0168 */ DWORD dwUnknown0008; +/* 0x000c - 0x016c */ DWORD MaxSimultaneousTextures; +/* 0x0010 - 0x0170 */ DWORD dwUnknown0010; +/* 0x0014 - 0x0174 */ LPDWORD pFirstHeapTexture; +} D3D9ResourceManager; + +typedef struct _tagD3D9SwapChain_ +{ +/* 0x0000 */ D3D9BaseObject BaseObject; +/* 0x0020 */ struct IDirect3DSwapChain9Vtbl* lpVtbl; +/* 0x0024 */ DWORD dwUnknown0024; +/* 0x0028 */ D3D9Surface* pPrimarySurface; +/* 0x002c */ D3D9Surface* pExtendedPrimarySurface; +/* 0x0030 */ DWORD dwUnknown0030; +/* 0x0034 */ D3D9DriverSurface** ppBackBufferList; +/* 0x0038 */ DWORD dwNumBackBuffers; +/* 0x003c */ DWORD ChainIndex; +/* 0x0040 */ DWORD AdapterGroupIndex; +/* 0x0044 */ D3DPRESENT_PARAMETERS PresentParameters; +/* 0x007c */ DWORD dwUnknown007c; +/* 0x0080 */ DWORD dwUnknown0080[2]; +/* 0x0088 */ LPDWORD dwUnknown0088; +/* 0x008c */ DWORD dwUnknown008c[4]; +/* 0x009c */ D3D9_Unknown6BC* pUnknown6BC; +/* 0x00a0 */ LPDWORD dwUnknown00a0; +/* 0x00a4 */ DWORD dwUnknown00a4[46]; +/* 0x015c */ LPDWORD pUnknown0174; +/* 0x0160 */ DWORD dwUnknown0160[4]; +/* 0x0170 */ HRESULT hResult; + +/* 0x0174 */ DWORD dwUnknown0174[26]; + +/* 0x01DC */ DWORD dwUnknownFlags; /* 1 = Show frame rate, 2 = Flip without vsync */ +/* 0x01E0 */ BOOL bForceRefreshRate; +/* 0x01E4 */ DWORD dwUnknown01dc[4]; + +/* 0x01f4 */ D3DSWAPEFFECT SwapEffect; +/* 0x01f8 */ DWORD dwUnknown01f8; +/* 0x01fc */ DWORD dwUnknown01fc; +/* 0x0200 */ DDGAMMARAMP GammaRamp; +} D3D9SwapChain_INT; + +typedef struct _tagD3D9BaseDevice_ +{ +/* 0x0000 */ struct IDirect3D9DeviceVtbl* lpVtbl; +/* 0x0004 */ CRITICAL_SECTION d3d9device_cs; +#ifdef D3D_DEBUG_INFO +/* N/A - 0x001c */ DWORD dbg0004; +/* N/A - 0x0020 */ DWORD dbg0008; +/* N/A - 0x0024 */ DWORD dbg000c; +/* N/A - 0x0028 */ DWORD dbg0010; +/* N/A - 0x002c */ DWORD dbg0014; +/* N/A - 0x0030 */ DWORD dbg0018; +/* N/A - 0x0034 */ DWORD dbg001c; +/* N/A - 0x0038 */ DWORD dbg0020; +/* N/A - 0x003c */ DWORD dbg0024; +/* N/A - 0x0040 */ DWORD dbg0028; +/* N/A - 0x0044 */ DWORD dbg002c; +/* N/A - 0x0048 */ DWORD dbg0030; +/* N/A - 0x004c */ DWORD dbg0034; +/* N/A - 0x0050 */ DWORD dbg0038; +#endif +/* 0x001c - 0x0054 */ DWORD unknown000007; +/* 0x0020 - 0x0058 */ DWORD dwProcessId; +/* 0x0024 - 0x005c */ struct _tagD3D9PUREDEVICE_* lpThis; +/* 0x0028 - 0x0060 */ DWORD dwDXVersion; +/* 0x002c - 0x0064 */ DWORD unknown000011; +/* 0x0030 - 0x0068 */ DWORD dwRefCnt; +/* 0x0034 - 0x006c */ DWORD unknown000013; +/* 0x0038 - 0x0070 */ D3D9ResourceManager* pResourceManager; +/* 0x003c - 0x0074 */ HWND hWnd; +/* 0x0040 - 0x0078 */ DWORD AdjustedBehaviourFlags; +/* 0x0044 - 0x007c */ DWORD BehaviourFlags; +/* 0x0048 - 0x0080 */ D3D9BaseSurface* pUnknown0010; +/* 0x004c - 0x0084 */ DWORD NumAdaptersInDevice; +/* 0x0050 - 0x0088 */ D3DDISPLAYMODE CurrentDisplayMode; +/* 0x0060 - 0x0098 */ DWORD unknown000024; +/* 0x0064 - 0x009c */ DWORD unknown000025; +/* 0x0068 - 0x00a0 */ DWORD unknown000026; +/* 0x006c - 0x00a4 */ DWORD unknown000027; +/* 0x0070 - 0x00a8 */ DWORD unknown000028; +/* 0x0074 - 0x00ac */ DWORD unknown000029; +/* 0x0078 - 0x00b0 */ DWORD unknown000030; +/* 0x007c - 0x00b4 */ DWORD unknown000031; +/* 0x0080 - 0x00b8 */ DWORD unknown000032; +/* 0x0084 - 0x00bc */ DWORD unknown000033; +/* 0x0088 - 0x00c0 */ DWORD unknown000034; +/* 0x008c - 0x00c4 */ DWORD unknown000035; +/* 0x0090 - 0x00c8 */ DWORD unknown000036; +/* 0x0094 - 0x00cc */ DWORD unknown000037; +/* 0x0098 - 0x00d0 */ DWORD unknown000038; +/* 0x009c - 0x00d4 */ DWORD unknown000039; +/* 0x00a0 - 0x00d8 */ DWORD unknown000040; +/* 0x00a4 - 0x00dc */ DWORD unknown000041; +/* 0x00a8 - 0x00e0 */ DWORD unknown000042; +/* 0x00ac - 0x00e4 */ DWORD unknown000043; +/* 0x00b0 - 0x00e8 */ DWORD unknown000044; +/* 0x00b4 - 0x00ec */ DWORD unknown000045; +/* 0x00b8 - 0x00f0 */ DWORD unknown000046; +/* 0x00bc - 0x00f4 */ DWORD unknown000047; +/* 0x00c0 - 0x00f8 */ DWORD unknown000048; +/* 0x00c4 - 0x00fc */ DWORD unknown000049; +/* 0x00c8 - 0x0100 */ DWORD unknown000050; +/* 0x00cc - 0x0104 */ DWORD unknown000051; +/* 0x00d0 - 0x0108 */ DWORD unknown000052; +/* 0x00d4 - 0x010c */ DWORD unknown000053; +/* 0x00d8 - 0x0110 */ DWORD unknown000054; +/* 0x00dc - 0x0114 */ DWORD unknown000055; +/* 0x00e0 - 0x0118 */ DWORD unknown000056; +/* 0x00e4 - 0x011c */ DWORD unknown000057; +/* 0x00e8 - 0x0120 */ DWORD unknown000058; +/* 0x00ec - 0x0124 */ DWORD unknown000059; +/* 0x00f0 - 0x0128 */ DWORD unknown000060; +/* 0x00f4 - 0x012c */ DWORD unknown000061; +/* 0x00f8 - 0x0130 */ DWORD unknown000062; +/* 0x00fc - 0x0134 */ DWORD unknown000063; +/* 0x0100 - 0x0138 */ DWORD unknown000064; +/* 0x0104 - 0x013c */ DWORD unknown000065; +/* 0x0108 - 0x0140 */ DWORD unknown000066; +/* 0x010c - 0x0144 */ DWORD unknown000067; +/* 0x0110 - 0x0148 */ DWORD AdapterIndexInGroup[D3D9_INT_MAX_NUM_ADAPTERS]; +/* 0x0140 - 0x0178 */ D3D9_DEVICEDATA DeviceData[D3D9_INT_MAX_NUM_ADAPTERS]; +/* 0x1df0 */ D3D9SwapChain_INT* pSwapChains[D3D9_INT_MAX_NUM_ADAPTERS]; +/* 0x1e20 */ D3D9SwapChain_INT* pSwapChains2[D3D9_INT_MAX_NUM_ADAPTERS]; +/* 0x1e50 */ D3D9BaseSurface* pUnknown001940; +/* 0x1e54 */ DWORD unknown001941; +/* 0x1e58 */ DWORD unknown001942; +/* 0x1e5c */ DWORD unknown001943; +/* 0x1e60 */ D3D9BaseSurface* pUnknown001944; +/* 0x1e64 */ D3DDEVTYPE DeviceType; +/* 0x1e68 */ LPDIRECT3D9_INT pDirect3D9; +/* 0x1e6c */ D3D9DriverSurface* pDriverSurfaceList; +/* 0x1e70 */ DWORD unknown001948; +/* 0x1e74 */ HANDLE hDX10UMDriver; +/* 0x1e78 */ HANDLE hDX10UMDriverInst; +/* 0x1e7c */ DWORD unknown001951; +/* 0x1e80 */ DWORD unknown001952; +/* 0x1e84 */ DWORD unknown001953; +/* 0x1e88 */ DWORD unknown001954; +/* 0x1e8c */ DWORD unknown001955; +/* 0x1e90 */ DWORD unknown001956; +/* 0x1e94 */ DWORD unknown001957; +/* 0x1e98 */ DWORD unknown001958; +/* 0x1e9c */ DWORD unknown001959; +/* 0x1ea0 */ DWORD unknown001960; +/* 0x1ea4 */ DWORD unknown001961; +/* 0x1ea8 */ DWORD unknown001962; +/* 0x1eac */ DWORD unknown001963; +/* 0x1eb0 */ DWORD unknown001964; +/* 0x1eb4 */ DWORD unknown001965; +/* 0x1eb8 */ DWORD unknown001966; +/* 0x1ebc */ DWORD unknown001967; +/* 0x1ec0 */ DWORD unknown001968; +/* 0x1ec4 */ DWORD unknown001969; +/* 0x1ec8 */ DWORD unknown001970; +/* 0x1ecc */ DWORD unknown001971; +/* 0x1ed0 */ DWORD unknown001972; +/* 0x1ed4 */ DWORD unknown001973; +/* 0x1ed8 */ DWORD unknown001974; +/* 0x1edc */ DWORD unknown001975; +/* 0x1ee0 */ DWORD unknown001976; +/* 0x1ee4 */ DWORD unknown001977; +/* 0x1ee8 */ DWORD unknown001978; +/* 0x1eec */ DWORD unknown001979; +/* 0x1ef0 */ DWORD unknown001980; +/* 0x1ef4 */ DWORD unknown001981; +/* 0x1ef8 */ DWORD unknown001982; +/* 0x1efc */ DWORD unknown001983; +/* 0x1f00 */ DWORD unknown001984; +/* 0x1f04 */ DWORD unknown001985; +/* 0x1f08 */ DWORD unknown001986; +/* 0x1f0c */ DWORD unknown001987; +/* 0x1f10 */ DWORD unknown001988; +/* 0x1f14 */ DWORD unknown001989; +/* 0x1f18 */ DWORD unknown001990; +/* 0x1f1c */ DWORD unknown001991; +/* 0x1f20 */ DWORD unknown001992; +/* 0x1f24 */ DWORD unknown001993; +/* 0x1f28 */ DWORD unknown001994; +/* 0x1f2c */ DWORD unknown001995; +/* 0x1f30 */ DWORD unknown001996; +/* 0x1f34 */ DWORD unknown001997; +/* 0x1f38 */ DWORD unknown001998; +/* 0x1f3c */ DWORD unknown001999; +/* 0x1f40 */ DWORD unknown002000; +/* 0x1f44 */ DWORD unknown002001; +} D3D9BaseDevice; + +typedef struct _tagD3D9PUREDEVICE_INT_ +{ +/* 0x0000 - 0x0000 */ D3D9BaseDevice BaseDevice; +/* 0x1f48 */ DWORD unknown002002; +/* 0x1f4c */ DWORD unknown002003; +/* 0x1f50 */ DWORD unknown002004; +/* 0x1f54 */ DWORD unknown002005; +/* 0x1f58 */ DWORD unknown002006; +/* 0x1f5c */ DWORD unknown002007; +/* 0x1f60 */ DWORD unknown002008; +/* 0x1f64 */ DWORD unknown002009; +/* 0x1f68 */ DWORD unknown002010; +/* 0x1f6c */ DWORD unknown002011; +/* 0x1f70 */ DWORD unknown002012; +/* 0x1f74 */ DWORD unknown002013; +/* 0x1f78 */ DWORD unknown002014; +/* 0x1f7c */ DWORD unknown002015; +/* 0x1f80 */ DWORD unknown002016; +/* 0x1f84 */ DWORD unknown002017; +/* 0x1f88 */ DWORD unknown002018; +/* 0x1f8c */ DWORD unknown002019; +/* 0x1f90 */ DWORD unknown002020; +/* 0x1f94 */ DWORD unknown002021; +/* 0x1f98 */ DWORD unknown002022; +/* 0x1f9c */ DWORD unknown002023; +/* 0x1fa0 */ DWORD unknown002024; +/* 0x1fa4 */ DWORD unknown002025; +/* 0x1fa8 - 0x1fe0 */ DWORD unknown002026; +/* 0x1fac */ DWORD unknown002027; +/* 0x1fb0 */ DWORD unknown002028; +/* 0x1fb4 */ DWORD unknown002029; +/* 0x1fb8 */ DWORD unknown002030; +/* 0x1fbc */ DWORD unknown002031; +/* 0x1fc0 */ DWORD unknown002032; +/* 0x1fc4 */ DWORD unknown002033; +/* 0x1fc8 */ DWORD unknown002034; +/* 0x1fcc */ DWORD unknown002035; +/* 0x1fd0 */ DWORD unknown002036; +/* 0x1fd4 */ DWORD unknown002037; +/* 0x1fd8 */ DWORD unknown002038; +/* 0x1fdc */ DWORD unknown002039; +/* 0x1fe0 */ DWORD unknown002040; +/* 0x1fe4 */ DWORD unknown002041; +/* 0x1fe8 */ DWORD unknown002042; +/* 0x1fec */ DWORD unknown002043; +/* 0x1ff0 */ DWORD unknown002044; +/* 0x1ff4 */ DWORD unknown002045; +/* 0x1ff8 */ DWORD unknown002046; +/* 0x1ffc */ DWORD unknown002047; +/* 0x2000 */ DWORD unknown002048; +/* 0x2004 */ DWORD unknown002049; +/* 0x2008 */ DWORD unknown002050; +/* 0x200c */ DWORD unknown002051; +/* 0x2010 */ DWORD unknown002052; +/* 0x2014 */ DWORD unknown002053; +/* 0x2018 */ DWORD unknown002054; +/* 0x201c */ DWORD unknown002055; +/* 0x2020 */ DWORD unknown002056; +/* 0x2024 */ DWORD unknown002057; +/* 0x2028 */ DWORD unknown002058; +/* 0x202c */ DWORD unknown002059; +/* 0x2030 */ DWORD unknown002060; +/* 0x2034 */ DWORD unknown002061; +/* 0x2038 */ DWORD unknown002062; +/* 0x203c */ DWORD unknown002063; +/* 0x2040 */ DWORD unknown002064; +/* 0x2044 */ DWORD unknown002065; +/* 0x2048 */ DWORD unknown002066; +/* 0x204c */ DWORD unknown002067; +/* 0x2050 */ DWORD unknown002068; +/* 0x2054 */ DWORD unknown002069; +/* 0x2058 */ DWORD unknown002070; +/* 0x205c */ DWORD unknown002071; +/* 0x2060 */ DWORD unknown002072; +/* 0x2064 */ DWORD unknown002073; +/* 0x2068 */ DWORD unknown002074; +/* 0x206c */ DWORD unknown002075; +/* 0x2070 */ DWORD unknown002076; +/* 0x2074 */ DWORD unknown002077; +/* 0x2078 */ DWORD unknown002078; +/* 0x207c */ DWORD unknown002079; +/* 0x2080 */ DWORD unknown002080; +/* 0x2084 */ DWORD unknown002081; +/* 0x2088 */ DWORD unknown002082; +/* 0x208c */ DWORD unknown002083; +/* 0x2090 */ DWORD unknown002084; +/* 0x2094 */ DWORD unknown002085; +/* 0x2098 */ DWORD unknown002086; +/* 0x209c */ DWORD unknown002087; +/* 0x20a0 */ DWORD unknown002088; +/* 0x20a4 */ DWORD unknown002089; +/* 0x20a8 */ DWORD unknown002090; +/* 0x20ac */ DWORD unknown002091; +/* 0x20b0 */ DWORD unknown002092; +/* 0x20b4 */ DWORD unknown002093; +/* 0x20b8 */ DWORD unknown002094; +/* 0x20bc */ DWORD unknown002095; +/* 0x20c0 */ DWORD unknown002096; +/* 0x20c4 */ DWORD unknown002097; +/* 0x20c8 */ DWORD unknown002098; +/* 0x20cc */ DWORD unknown002099; +/* 0x20d0 */ DWORD unknown002100; +/* 0x20d4 */ DWORD unknown002101; +/* 0x20d8 */ DWORD unknown002102; +/* 0x20dc */ DWORD unknown002103; +/* 0x20e0 */ DWORD unknown002104; +/* 0x20e4 */ DWORD unknown002105; +/* 0x20e8 */ DWORD unknown002106; +/* 0x20ec */ DWORD unknown002107; +/* 0x20f0 */ DWORD unknown002108; +/* 0x20f4 */ DWORD unknown002109; +/* 0x20f8 */ DWORD unknown002110; +/* 0x20fc */ DWORD unknown002111; +/* 0x2100 */ DWORD unknown002112; +/* 0x2104 */ DWORD unknown002113; +/* 0x2108 */ DWORD unknown002114; +/* 0x210c */ DWORD unknown002115; +/* 0x2110 */ DWORD unknown002116; +/* 0x2114 */ DWORD unknown002117; +/* 0x2118 */ DWORD unknown002118; +/* 0x211c */ DWORD unknown002119; +/* 0x2120 */ DWORD unknown002120; +/* 0x2124 */ DWORD unknown002121; +/* 0x2128 */ DWORD unknown002122; +/* 0x212c */ DWORD unknown002123; +/* 0x2130 */ DWORD unknown002124; +/* 0x2134 */ DWORD unknown002125; +/* 0x2138 */ DWORD unknown002126; +/* 0x213c */ DWORD unknown002127; +/* 0x2140 */ DWORD unknown002128; +/* 0x2144 */ DWORD unknown002129; +/* 0x2148 */ DWORD unknown002130; +/* 0x214c */ DWORD unknown002131; +/* 0x2150 */ DWORD unknown002132; +/* 0x2154 */ DWORD unknown002133; +/* 0x2158 */ DWORD unknown002134; +/* 0x215c */ DWORD unknown002135; +/* 0x2160 */ DWORD unknown002136; +/* 0x2164 */ DWORD unknown002137; +/* 0x2168 */ DWORD unknown002138; +/* 0x216c */ DWORD unknown002139; +/* 0x2170 */ DWORD unknown002140; +/* 0x2174 */ DWORD unknown002141; +/* 0x2178 */ DWORD unknown002142; +/* 0x217c */ DWORD unknown002143; +/* 0x2180 */ DWORD unknown002144; +/* 0x2184 */ DWORD unknown002145; +/* 0x2188 */ DWORD unknown002146; +/* 0x218c */ DWORD unknown002147; +/* 0x2190 */ DWORD unknown002148; +/* 0x2194 */ DWORD unknown002149; +/* 0x2198 */ DWORD unknown002150; +/* 0x219c */ DWORD unknown002151; +/* 0x21a0 */ DWORD unknown002152; +/* 0x21a4 */ DWORD unknown002153; +/* 0x21a8 */ DWORD unknown002154; +/* 0x21ac */ DWORD unknown002155; +/* 0x21b0 */ DWORD unknown002156; +/* 0x21b4 */ DWORD unknown002157; +/* 0x21b8 */ DWORD unknown002158; +/* 0x21bc */ DWORD unknown002159; +/* 0x21c0 */ DWORD unknown002160; +/* 0x21c4 */ DWORD unknown002161; +/* 0x21c8 */ DWORD unknown002162; +/* 0x21cc */ DWORD unknown002163; +/* 0x21d0 */ DWORD unknown002164; +/* 0x21d4 */ DWORD unknown002165; +/* 0x21d8 */ DWORD unknown002166; +/* 0x21dc */ DWORD unknown002167; +/* 0x21e0 */ DWORD unknown002168; +/* 0x21e4 */ DWORD unknown002169; +/* 0x21e8 */ DWORD unknown002170; +/* 0x21ec */ DWORD unknown002171; +/* 0x21f0 */ DWORD unknown002172; +/* 0x21f4 */ DWORD unknown002173; +/* 0x21f8 */ DWORD unknown002174; +/* 0x21fc */ DWORD unknown002175; +/* 0x2200 */ DWORD unknown002176; +/* 0x2204 */ DWORD unknown002177; +/* 0x2208 */ DWORD unknown002178; +/* 0x220c */ DWORD unknown002179; +/* 0x2210 */ DWORD unknown002180; +/* 0x2214 */ DWORD unknown002181; +/* 0x2218 */ DWORD unknown002182; +/* 0x221c */ DWORD unknown002183; +/* 0x2220 */ DWORD unknown002184; +/* 0x2224 */ DWORD unknown002185; +/* 0x2228 */ DWORD unknown002186; +/* 0x222c */ DWORD unknown002187; +/* 0x2230 */ DWORD unknown002188; +/* 0x2234 */ DWORD unknown002189; +/* 0x2238 */ DWORD unknown002190; +/* 0x223c */ DWORD unknown002191; +/* 0x2240 */ DWORD unknown002192; +/* 0x2244 */ DWORD unknown002193; +/* 0x2248 */ DWORD unknown002194; +/* 0x224c */ DWORD unknown002195; +/* 0x2250 */ DWORD unknown002196; +/* 0x2254 */ DWORD unknown002197; +/* 0x2258 */ DWORD unknown002198; +/* 0x225c */ DWORD unknown002199; +/* 0x2260 */ DWORD unknown002200; +/* 0x2264 */ DWORD unknown002201; +/* 0x2268 */ DWORD unknown002202; +/* 0x226c */ DWORD unknown002203; +/* 0x2270 */ DWORD unknown002204; +/* 0x2274 */ DWORD unknown002205; +/* 0x2278 */ DWORD unknown002206; +/* 0x227c */ DWORD unknown002207; +/* 0x2280 */ DWORD unknown002208; +/* 0x2284 */ DWORD unknown002209; +/* 0x2288 */ DWORD unknown002210; +/* 0x228c */ DWORD unknown002211; +/* 0x2290 */ DWORD unknown002212; +/* 0x2294 */ DWORD unknown002213; +/* 0x2298 */ DWORD unknown002214; +/* 0x229c */ DWORD unknown002215; +/* 0x22a0 */ DWORD unknown002216; +/* 0x22a4 */ DWORD unknown002217; +/* 0x22a8 */ DWORD unknown002218; +/* 0x22ac */ DWORD unknown002219; +/* 0x22b0 */ DWORD unknown002220; +/* 0x22b4 */ DWORD unknown002221; +/* 0x22b8 */ DWORD unknown002222; +/* 0x22bc */ DWORD unknown002223; +/* 0x22c0 */ DWORD unknown002224; +/* 0x22c4 */ DWORD unknown002225; +/* 0x22c8 */ DWORD unknown002226; +/* 0x22cc */ DWORD unknown002227; +/* 0x22d0 */ DWORD unknown002228; +/* 0x22d4 */ DWORD unknown002229; +/* 0x22d8 */ DWORD unknown002230; +/* 0x22dc */ DWORD unknown002231; +/* 0x22e0 */ DWORD unknown002232; +/* 0x22e4 */ DWORD unknown002233; +/* 0x22e8 */ DWORD unknown002234; +/* 0x22ec */ DWORD unknown002235; +/* 0x22f0 */ DWORD unknown002236; +/* 0x22f4 */ DWORD unknown002237; +/* 0x22f8 */ DWORD unknown002238; +/* 0x22fc */ DWORD unknown002239; +/* 0x2300 */ DWORD unknown002240; +/* 0x2304 */ DWORD unknown002241; +/* 0x2308 */ DWORD unknown002242; +/* 0x230c */ DWORD unknown002243; +/* 0x2310 */ DWORD unknown002244; +/* 0x2314 */ DWORD unknown002245; +/* 0x2318 */ DWORD unknown002246; +/* 0x231c */ DWORD unknown002247; +/* 0x2320 */ DWORD unknown002248; +/* 0x2324 */ DWORD unknown002249; +/* 0x2328 */ DWORD unknown002250; +/* 0x232c */ DWORD unknown002251; +/* 0x2330 */ DWORD unknown002252; +/* 0x2334 */ DWORD unknown002253; +/* 0x2338 */ DWORD unknown002254; +/* 0x233c */ DWORD unknown002255; +/* 0x2340 */ DWORD unknown002256; +/* 0x2344 */ DWORD unknown002257; +/* 0x2348 */ DWORD unknown002258; +/* 0x234c */ DWORD unknown002259; +/* 0x2350 */ DWORD unknown002260; +/* 0x2354 */ DWORD unknown002261; +/* 0x2358 */ DWORD unknown002262; +/* 0x235c */ DWORD unknown002263; +/* 0x2360 */ DWORD unknown002264; +/* 0x2364 */ DWORD unknown002265; +/* 0x2368 */ DWORD unknown002266; +/* 0x236c */ DWORD unknown002267; +/* 0x2370 */ DWORD unknown002268; +/* 0x2374 */ DWORD unknown002269; +/* 0x2378 */ DWORD unknown002270; +/* 0x237c */ DWORD unknown002271; +/* 0x2380 */ DWORD unknown002272; +/* 0x2384 */ DWORD unknown002273; +/* 0x2388 */ DWORD unknown002274; +/* 0x238c */ DWORD unknown002275; +/* 0x2390 */ DWORD unknown002276; +/* 0x2394 */ DWORD unknown002277; +/* 0x2398 */ DWORD unknown002278; +/* 0x239c */ DWORD unknown002279; +/* 0x23a0 */ DWORD unknown002280; +/* 0x23a4 */ DWORD unknown002281; +/* 0x23a8 */ DWORD unknown002282; +/* 0x23ac */ DWORD unknown002283; +/* 0x23b0 */ DWORD unknown002284; +/* 0x23b4 */ DWORD unknown002285; +/* 0x23b8 */ DWORD unknown002286; +/* 0x23bc */ DWORD unknown002287; +/* 0x23c0 */ DWORD unknown002288; +/* 0x23c4 */ DWORD unknown002289; +/* 0x23c8 */ DWORD unknown002290; +/* 0x23cc */ DWORD unknown002291; +/* 0x23d0 */ DWORD unknown002292; +/* 0x23d4 */ DWORD unknown002293; +/* 0x23d8 */ DWORD unknown002294; +/* 0x23dc */ DWORD unknown002295; +/* 0x23e0 */ DWORD unknown002296; +/* 0x23e4 */ DWORD unknown002297; +/* 0x23e8 */ DWORD unknown002298; +/* 0x23ec */ DWORD unknown002299; +/* 0x23f0 */ DWORD unknown002300; +/* 0x23f4 */ DWORD unknown002301; +/* 0x23f8 */ DWORD unknown002302; +/* 0x23fc */ DWORD unknown002303; +/* 0x2400 */ DWORD unknown002304; +/* 0x2404 */ DWORD unknown002305; +/* 0x2408 */ DWORD unknown002306; +/* 0x240c */ DWORD unknown002307; +/* 0x2410 */ DWORD unknown002308; +/* 0x2414 */ DWORD unknown002309; +/* 0x2418 */ DWORD unknown002310; +/* 0x241c */ DWORD unknown002311; +/* 0x2420 */ DWORD unknown002312; +/* 0x2424 */ DWORD unknown002313; +/* 0x2428 */ DWORD unknown002314; +/* 0x242c */ DWORD unknown002315; +/* 0x2430 */ DWORD unknown002316; +/* 0x2434 */ DWORD unknown002317; +} D3D9PUREDEVICE_INT, FAR *LPD3D9PUREDEVICE_INT; + +typedef struct _tagD3D9HALDEVICE_INT_ +{ +/* 0x0000 */ D3D9PUREDEVICE_INT PureDevice; +#ifdef D3D_DEBUG_INFO +/* N/A - 0x0004 */ DWORD dbg0004; +/* N/A - 0x0008 */ DWORD dbg0008; +/* N/A - 0x000c */ DWORD dbg000c; +/* N/A - 0x0010 */ DWORD dbg0010; +/* N/A - 0x0014 */ DWORD dbg0014; +/* N/A - 0x0018 */ DWORD dbg0018; +/* N/A - 0x001c */ DWORD dbg001c; +/* N/A - 0x0020 */ DWORD dbg0020; +/* N/A - 0x0024 */ DWORD dbg0024; +/* N/A - 0x0028 */ DWORD dbg0028; +/* N/A - 0x002c */ DWORD dbg002c; +/* N/A - 0x0030 */ DWORD dbg0030; +/* N/A - 0x0034 */ DWORD dbg0034; +/* N/A - 0x0038 */ DWORD dbg0038; +#endif +/* 0x2438 */ DWORD unknown002438; +/* 0x243c */ DWORD unknown00243c; +/* 0x2440 */ DWORD unknown002440; +/* 0x2444 */ DWORD unknown002444; +/* 0x2448 */ DWORD unknown002448; +/* 0x244c */ DWORD unknown00244c; +/* 0x2450 */ DWORD unknown002450; +/* 0x2454 */ DWORD unknown002454; +/* 0x2458 */ DWORD unknown002458; +/* 0x245c */ DWORD unknown00245c; +/* 0x2460 */ DWORD unknown002460; +/* 0x2464 */ DWORD unknown002464; +/* 0x2468 */ DWORD unknown002468; +/* 0x246c */ DWORD unknown00246c; +/* 0x2470 */ DWORD unknown002470; +/* 0x2474 */ DWORD unknown002474; +/* 0x2478 */ DWORD unknown002478; +/* 0x247c */ DWORD unknown00247c; +/* 0x2480 */ DWORD unknown002480; +/* 0x2484 */ DWORD unknown002484; +/* 0x2488 */ DWORD unknown002488; +/* 0x248c */ DWORD unknown00248c; +/* 0x2490 */ DWORD unknown002490; +/* 0x2494 */ DWORD unknown002494; +/* 0x2498 */ DWORD unknown002498; +/* 0x249c */ DWORD unknown00249c; +/* 0x24a0 */ DWORD unknown0024a0; +/* 0x24a4 */ DWORD unknown0024a4; +/* 0x24a8 */ DWORD unknown0024a8; +/* 0x24ac */ DWORD unknown0024ac; +/* 0x24b0 */ DWORD unknown0024b0; +/* 0x24b4 */ DWORD unknown0024b4; +/* 0x24b8 */ DWORD unknown0024b8; +/* 0x24bc */ DWORD unknown0024bc; +/* 0x24c0 */ DWORD unknown0024c0; +/* 0x24c4 */ DWORD unknown0024c4; +/* 0x24c8 */ DWORD unknown0024c8; +/* 0x24cc */ DWORD unknown0024cc; +/* 0x24d0 */ DWORD unknown0024d0; +/* 0x24d4 */ DWORD unknown0024d4; +/* 0x24d8 */ DWORD unknown0024d8; +/* 0x24dc */ DWORD unknown0024dc; +/* 0x24e0 */ DWORD unknown0024e0; +/* 0x24e4 */ DWORD unknown0024e4; +/* 0x24e8 */ DWORD unknown0024e8; +/* 0x24ec */ DWORD unknown0024ec; +/* 0x24f0 */ DWORD unknown0024f0; +/* 0x24f4 */ DWORD unknown0024f4; +/* 0x24f8 */ DWORD unknown0024f8; +/* 0x24fc */ DWORD unknown0024fc; +/* 0x2500 */ DWORD unknown002500; +/* 0x2504 */ DWORD unknown002504; +/* 0x2508 */ DWORD unknown002508; +/* 0x250c */ DWORD unknown00250c; +/* 0x2510 */ DWORD unknown002510; +/* 0x2514 */ DWORD unknown002514; +/* 0x2518 */ DWORD unknown002518; +/* 0x251c */ DWORD unknown00251c; +/* 0x2520 */ DWORD unknown002520; +/* 0x2524 */ DWORD unknown002524; +/* 0x2528 */ DWORD unknown002528; +/* 0x252c */ DWORD unknown00252c; +/* 0x2530 */ DWORD unknown002530; +/* 0x2534 */ DWORD unknown002534; +/* 0x2538 */ DWORD unknown002538; +/* 0x253c */ DWORD unknown00253c; +/* 0x2540 */ DWORD unknown002540; +/* 0x2544 */ DWORD unknown002544; +/* 0x2548 */ DWORD unknown002548; +/* 0x254c */ DWORD unknown00254c; +/* 0x2550 */ DWORD unknown002550; +/* 0x2554 */ DWORD unknown002554; +/* 0x2558 */ DWORD unknown002558; +/* 0x255c */ DWORD unknown00255c; +/* 0x2560 */ DWORD unknown002560; +/* 0x2564 */ DWORD unknown002564; +/* 0x2568 */ DWORD unknown002568; +/* 0x256c */ DWORD unknown00256c; +/* 0x2570 */ DWORD unknown002570; +/* 0x2574 */ DWORD unknown002574; +/* 0x2578 */ DWORD unknown002578; +/* 0x257c */ DWORD unknown00257c; +/* 0x2580 */ DWORD unknown002580; +/* 0x2584 */ DWORD unknown002584; +/* 0x2588 */ DWORD unknown002588; +/* 0x258c */ DWORD unknown00258c; +/* 0x2590 */ DWORD unknown002590; +/* 0x2594 */ DWORD unknown002594; +/* 0x2598 */ DWORD unknown002598; +/* 0x259c */ DWORD unknown00259c; +/* 0x25a0 */ DWORD unknown0025a0; +/* 0x25a4 */ DWORD unknown0025a4; +/* 0x25a8 */ DWORD unknown0025a8; +/* 0x25ac */ DWORD unknown0025ac; +/* 0x25b0 */ DWORD unknown0025b0; +/* 0x25b4 */ DWORD unknown0025b4; +/* 0x25b8 */ DWORD unknown0025b8; +/* 0x25bc */ DWORD unknown0025bc; +/* 0x25c0 */ DWORD unknown0025c0; +/* 0x25c4 */ DWORD unknown0025c4; +/* 0x25c8 */ DWORD unknown0025c8; +/* 0x25cc */ DWORD unknown0025cc; +/* 0x25d0 */ DWORD unknown0025d0; +/* 0x25d4 */ DWORD unknown0025d4; +/* 0x25d8 */ DWORD unknown0025d8; +/* 0x25dc */ DWORD unknown0025dc; +/* 0x25e0 */ DWORD unknown0025e0; +/* 0x25e4 */ DWORD unknown0025e4; +/* 0x25e8 */ DWORD unknown0025e8; +/* 0x25ec */ DWORD unknown0025ec; +/* 0x25f0 */ DWORD unknown0025f0; +/* 0x25f4 */ DWORD unknown0025f4; +/* 0x25f8 */ DWORD unknown0025f8; +/* 0x25fc */ DWORD unknown0025fc; + +/* 0x2600 */ DWORD unknown002600; +/* 0x2604 */ DWORD unknown002604; +/* 0x2608 */ DWORD unknown002608; +/* 0x260c */ DWORD unknown00260c; +/* 0x2610 */ DWORD unknown002610; +/* 0x2614 */ DWORD unknown002614; +/* 0x2618 */ DWORD unknown002618; +/* 0x261c */ DWORD unknown00261c; +/* 0x2620 */ DWORD unknown002620; +/* 0x2624 */ DWORD unknown002624; +/* 0x2628 */ DWORD unknown002628; +/* 0x262c */ DWORD unknown00262c; +/* 0x2630 */ DWORD unknown002630; +/* 0x2634 */ DWORD unknown002634; +/* 0x2638 */ DWORD unknown002638; +/* 0x263c */ DWORD unknown00263c; +/* 0x2640 */ DWORD unknown002640; +/* 0x2644 */ DWORD unknown002644; +/* 0x2648 */ DWORD unknown002648; +/* 0x264c */ DWORD unknown00264c; +/* 0x2650 */ DWORD unknown002650; +/* 0x2654 */ DWORD unknown002654; +/* 0x2658 */ DWORD unknown002658; +/* 0x265c */ DWORD unknown00265c; +/* 0x2660 */ DWORD unknown002660; +/* 0x2664 */ DWORD unknown002664; +/* 0x2668 */ DWORD unknown002668; +/* 0x266c */ DWORD unknown00266c; +/* 0x2670 */ DWORD unknown002670; +/* 0x2674 */ DWORD unknown002674; +/* 0x2678 */ DWORD unknown002678; +/* 0x267c */ DWORD unknown00267c; +/* 0x2680 */ DWORD unknown002680; +/* 0x2684 */ DWORD unknown002684; +/* 0x2688 */ DWORD unknown002688; +/* 0x268c */ DWORD unknown00268c; +/* 0x2690 */ DWORD unknown002690; +/* 0x2694 */ DWORD unknown002694; +/* 0x2698 */ DWORD unknown002698; +/* 0x269c */ DWORD unknown00269c; +/* 0x26a0 */ DWORD unknown0026a0; +/* 0x26a4 */ DWORD unknown0026a4; +/* 0x26a8 */ DWORD unknown0026a8; +/* 0x26ac */ DWORD unknown0026ac; +/* 0x26b0 */ DWORD unknown0026b0; +/* 0x26b4 */ DWORD unknown0026b4; +/* 0x26b8 */ DWORD unknown0026b8; +/* 0x26bc */ DWORD unknown0026bc; +/* 0x26c0 */ DWORD unknown0026c0; +/* 0x26c4 */ DWORD unknown0026c4; +/* 0x26c8 */ DWORD unknown0026c8; +/* 0x26cc */ DWORD unknown0026cc; +/* 0x26d0 */ DWORD unknown0026d0; +/* 0x26d4 */ DWORD unknown0026d4; +/* 0x26d8 */ DWORD unknown0026d8; +/* 0x26dc */ DWORD unknown0026dc; +/* 0x26e0 */ DWORD unknown0026e0; +/* 0x26e4 */ DWORD unknown0026e4; +/* 0x26e8 */ DWORD unknown0026e8; +/* 0x26ec */ DWORD unknown0026ec; +/* 0x26f0 */ DWORD unknown0026f0; +/* 0x26f4 */ DWORD unknown0026f4; +/* 0x26f8 */ DWORD unknown0026f8; +/* 0x26fc */ DWORD unknown0026fc; + +/* 0x2700 */ DWORD unknown002700; +/* 0x2704 */ DWORD unknown002704; +/* 0x2708 */ DWORD unknown002708; +/* 0x270c */ DWORD unknown00270c; +/* 0x2710 */ DWORD unknown002710; +/* 0x2714 */ DWORD unknown002714; +/* 0x2718 */ DWORD unknown002718; +/* 0x271c */ DWORD unknown00271c; +/* 0x2720 */ DWORD unknown002720; +/* 0x2724 */ DWORD unknown002724; +/* 0x2728 */ DWORD unknown002728; +/* 0x272c */ DWORD unknown00272c; +/* 0x2730 */ DWORD unknown002730; +/* 0x2734 */ DWORD unknown002734; +/* 0x2738 */ DWORD unknown002738; +/* 0x273c */ DWORD unknown00273c; +/* 0x2740 */ DWORD unknown002740; +/* 0x2744 */ DWORD unknown002744; +/* 0x2748 */ DWORD unknown002748; +/* 0x274c */ DWORD unknown00274c; +/* 0x2750 */ DWORD unknown002750; +/* 0x2754 */ DWORD unknown002754; +/* 0x2758 */ DWORD unknown002758; +/* 0x275c */ DWORD unknown00275c; +/* 0x2760 */ DWORD unknown002760; +/* 0x2764 */ DWORD unknown002764; +/* 0x2768 */ DWORD unknown002768; +/* 0x276c */ DWORD unknown00276c; +/* 0x2770 */ DWORD unknown002770; +/* 0x2774 */ DWORD unknown002774; +/* 0x2778 */ DWORD unknown002778; +/* 0x277c */ DWORD unknown00277c; +/* 0x2780 */ DWORD unknown002780; +/* 0x2784 */ DWORD unknown002784; +/* 0x2788 */ DWORD unknown002788; +/* 0x278c */ DWORD unknown00278c; +/* 0x2790 */ DWORD unknown002790; +/* 0x2794 */ DWORD unknown002794; +/* 0x2798 */ DWORD unknown002798; +/* 0x279c */ DWORD unknown00279c; +/* 0x27a0 */ DWORD unknown0027a0; +/* 0x27a4 */ DWORD unknown0027a4; +/* 0x27a8 */ DWORD unknown0027a8; +/* 0x27ac */ DWORD unknown0027ac; +/* 0x27b0 */ DWORD unknown0027b0; +/* 0x27b4 */ DWORD unknown0027b4; +/* 0x27b8 */ DWORD unknown0027b8; +/* 0x27bc */ DWORD unknown0027bc; +/* 0x27c0 */ DWORD unknown0027c0; +/* 0x27c4 */ DWORD unknown0027c4; +/* 0x27c8 */ DWORD unknown0027c8; +/* 0x27cc */ DWORD unknown0027cc; +/* 0x27d0 */ DWORD unknown0027d0; +/* 0x27d4 */ DWORD unknown0027d4; +/* 0x27d8 */ DWORD unknown0027d8; +/* 0x27dc */ DWORD unknown0027dc; +/* 0x27e0 */ DWORD unknown0027e0; +/* 0x27e4 */ DWORD unknown0027e4; +/* 0x27e8 */ DWORD unknown0027e8; +/* 0x27ec */ DWORD unknown0027ec; +/* 0x27f0 */ DWORD unknown0027f0; +/* 0x27f4 */ DWORD unknown0027f4; +/* 0x27f8 */ DWORD unknown0027f8; +/* 0x27fc */ DWORD unknown0027fc; + +/* 0x2800 */ DWORD unknown002800; +/* 0x2804 */ DWORD unknown002804; +/* 0x2808 */ DWORD unknown002808; +/* 0x280c */ DWORD unknown00280c; +/* 0x2810 */ DWORD unknown002810; +/* 0x2814 */ DWORD unknown002814; +/* 0x2818 */ DWORD unknown002818; +/* 0x281c */ DWORD unknown00281c; +/* 0x2820 */ DWORD unknown002820; +/* 0x2824 */ DWORD unknown002824; +/* 0x2828 */ DWORD unknown002828; +/* 0x282c */ DWORD unknown00282c; +/* 0x2830 */ DWORD unknown002830; +/* 0x2834 */ DWORD unknown002834; +/* 0x2838 */ DWORD unknown002838; +/* 0x283c */ DWORD unknown00283c; +/* 0x2840 */ DWORD unknown002840; +/* 0x2844 */ DWORD unknown002844; +/* 0x2848 */ DWORD unknown002848; +/* 0x284c */ DWORD unknown00284c; +/* 0x2850 */ DWORD unknown002850; +/* 0x2854 */ DWORD unknown002854; +/* 0x2858 */ DWORD unknown002858; +/* 0x285c */ DWORD unknown00285c; +/* 0x2860 */ DWORD unknown002860; +/* 0x2864 */ DWORD unknown002864; +/* 0x2868 */ DWORD unknown002868; +/* 0x286c */ DWORD unknown00286c; +/* 0x2870 */ DWORD unknown002870; +/* 0x2874 */ DWORD unknown002874; +/* 0x2878 */ DWORD unknown002878; +/* 0x287c */ DWORD unknown00287c; +/* 0x2880 */ DWORD unknown002880; +/* 0x2884 */ DWORD unknown002884; +/* 0x2888 */ DWORD unknown002888; +/* 0x288c */ DWORD unknown00288c; +/* 0x2890 */ DWORD unknown002890; +/* 0x2894 */ DWORD unknown002894; +/* 0x2898 */ DWORD unknown002898; +/* 0x289c */ DWORD unknown00289c; +/* 0x28a0 */ DWORD unknown0028a0; +/* 0x28a4 */ DWORD unknown0028a4; +/* 0x28a8 */ DWORD unknown0028a8; +/* 0x28ac */ DWORD unknown0028ac; +/* 0x28b0 */ DWORD unknown0028b0; +/* 0x28b4 */ DWORD unknown0028b4; +/* 0x28b8 */ DWORD unknown0028b8; +/* 0x28bc */ DWORD unknown0028bc; +/* 0x28c0 */ DWORD unknown0028c0; +/* 0x28c4 */ DWORD unknown0028c4; +/* 0x28c8 */ DWORD unknown0028c8; +/* 0x28cc */ DWORD unknown0028cc; +/* 0x28d0 */ DWORD unknown0028d0; +/* 0x28d4 */ DWORD unknown0028d4; +/* 0x28d8 */ DWORD unknown0028d8; +/* 0x28dc */ DWORD unknown0028dc; +/* 0x28e0 */ DWORD unknown0028e0; +/* 0x28e4 */ DWORD unknown0028e4; +/* 0x28e8 */ DWORD unknown0028e8; +/* 0x28ec */ DWORD unknown0028ec; +/* 0x28f0 */ DWORD unknown0028f0; +/* 0x28f4 */ DWORD unknown0028f4; +/* 0x28f8 */ DWORD unknown0028f8; +/* 0x28fc */ DWORD unknown0028fc; + +/* 0x2900 */ DWORD unknown002900; +/* 0x2904 */ DWORD unknown002904; +/* 0x2908 */ DWORD unknown002908; +/* 0x290c */ DWORD unknown00290c; +/* 0x2910 */ DWORD unknown002910; +/* 0x2914 */ DWORD unknown002914; +/* 0x2918 */ DWORD unknown002918; +/* 0x291c */ DWORD unknown00291c; +/* 0x2920 */ DWORD unknown002920; +/* 0x2924 */ DWORD unknown002924; +/* 0x2928 */ DWORD unknown002928; +/* 0x292c */ DWORD unknown00292c; +/* 0x2930 */ DWORD unknown002930; +/* 0x2934 */ DWORD unknown002934; +/* 0x2938 */ DWORD unknown002938; +/* 0x293c */ DWORD unknown00293c; +/* 0x2940 */ DWORD unknown002940; +/* 0x2944 */ DWORD unknown002944; +/* 0x2948 */ DWORD unknown002948; +/* 0x294c */ DWORD unknown00294c; +/* 0x2950 */ DWORD unknown002950; +/* 0x2954 */ DWORD unknown002954; +/* 0x2958 */ DWORD unknown002958; +/* 0x295c */ DWORD unknown00295c; +/* 0x2960 */ DWORD unknown002960; +/* 0x2964 */ DWORD unknown002964; +/* 0x2968 */ DWORD unknown002968; +/* 0x296c */ DWORD unknown00296c; +/* 0x2970 */ DWORD unknown002970; +/* 0x2974 */ DWORD unknown002974; +/* 0x2978 */ DWORD unknown002978; +/* 0x297c */ DWORD unknown00297c; +/* 0x2980 */ DWORD unknown002980; +/* 0x2984 */ DWORD unknown002984; +/* 0x2988 */ DWORD unknown002988; +/* 0x298c */ DWORD unknown00298c; +/* 0x2990 */ DWORD unknown002990; +/* 0x2994 */ DWORD unknown002994; +/* 0x2998 */ DWORD unknown002998; +/* 0x299c */ DWORD unknown00299c; +/* 0x29a0 */ DWORD unknown0029a0; +/* 0x29a4 */ DWORD unknown0029a4; +/* 0x29a8 */ DWORD unknown0029a8; +/* 0x29ac */ DWORD unknown0029ac; +/* 0x29b0 */ DWORD unknown0029b0; +/* 0x29b4 */ DWORD unknown0029b4; +/* 0x29b8 */ DWORD unknown0029b8; +/* 0x29bc */ DWORD unknown0029bc; +/* 0x29c0 */ DWORD unknown0029c0; +/* 0x29c4 */ DWORD unknown0029c4; +/* 0x29c8 */ DWORD unknown0029c8; +/* 0x29cc */ DWORD unknown0029cc; +/* 0x29d0 */ DWORD unknown0029d0; +/* 0x29d4 */ DWORD unknown0029d4; +/* 0x29d8 */ DWORD unknown0029d8; +/* 0x29dc */ DWORD unknown0029dc; +/* 0x29e0 */ DWORD unknown0029e0; +/* 0x29e4 */ DWORD unknown0029e4; +/* 0x29e8 */ DWORD unknown0029e8; +/* 0x29ec */ DWORD unknown0029ec; +/* 0x29f0 */ DWORD unknown0029f0; +/* 0x29f4 */ DWORD unknown0029f4; +/* 0x29f8 */ DWORD unknown0029f8; +/* 0x29fc */ DWORD unknown0029fc; + +/* 0x2a00 */ DWORD unknown002a00; +/* 0x2a04 */ DWORD unknown002a04; +/* 0x2a08 */ DWORD unknown002a08; +/* 0x2a0c */ DWORD unknown002a0c; +/* 0x2a10 */ DWORD unknown002a10; +/* 0x2a14 */ DWORD unknown002a14; +/* 0x2a18 */ DWORD unknown002a18; +/* 0x2a1c */ DWORD unknown002a1c; +/* 0x2a20 */ DWORD unknown002a20; +/* 0x2a24 */ DWORD unknown002a24; +/* 0x2a28 */ DWORD unknown002a28; +/* 0x2a2c */ DWORD unknown002a2c; +/* 0x2a30 */ DWORD unknown002a30; +/* 0x2a34 */ DWORD unknown002a34; +/* 0x2a38 */ DWORD unknown002a38; +/* 0x2a3c */ DWORD unknown002a3c; +/* 0x2a40 */ DWORD unknown002a40; +/* 0x2a44 */ DWORD unknown002a44; +/* 0x2a48 */ DWORD unknown002a48; +/* 0x2a4c */ DWORD unknown002a4c; +/* 0x2a50 */ DWORD unknown002a50; +/* 0x2a54 */ DWORD unknown002a54; +/* 0x2a58 */ DWORD unknown002a58; +/* 0x2a5c */ DWORD unknown002a5c; +/* 0x2a60 */ DWORD unknown002a60; +/* 0x2a64 */ DWORD unknown002a64; +/* 0x2a68 */ DWORD unknown002a68; +/* 0x2a6c */ DWORD unknown002a6c; +/* 0x2a70 */ DWORD unknown002a70; +/* 0x2a74 */ DWORD unknown002a74; +/* 0x2a78 */ DWORD unknown002a78; +/* 0x2a7c */ DWORD unknown002a7c; +/* 0x2a80 */ DWORD unknown002a80; +/* 0x2a84 */ DWORD unknown002a84; +/* 0x2a88 */ DWORD unknown002a88; +/* 0x2a8c */ DWORD unknown002a8c; +/* 0x2a90 */ DWORD unknown002a90; +/* 0x2a94 */ DWORD unknown002a94; +/* 0x2a98 */ DWORD unknown002a98; +/* 0x2a9c */ DWORD unknown002a9c; +/* 0x2aa0 */ DWORD unknown002aa0; +/* 0x2aa4 */ DWORD unknown002aa4; +/* 0x2aa8 */ DWORD unknown002aa8; +/* 0x2aac */ DWORD unknown002aac; +/* 0x2ab0 */ DWORD unknown002ab0; +/* 0x2ab4 */ DWORD unknown002ab4; +/* 0x2ab8 */ DWORD unknown002ab8; +/* 0x2abc */ DWORD unknown002abc; +/* 0x2ac0 */ DWORD unknown002ac0; +/* 0x2ac4 */ DWORD unknown002ac4; +/* 0x2ac8 */ DWORD unknown002ac8; +/* 0x2acc */ DWORD unknown002acc; +/* 0x2ad0 */ DWORD unknown002ad0; +/* 0x2ad4 */ DWORD unknown002ad4; +/* 0x2ad8 */ DWORD unknown002ad8; +/* 0x2adc */ DWORD unknown002adc; +/* 0x2ae0 */ DWORD unknown002ae0; +/* 0x2ae4 */ DWORD unknown002ae4; +/* 0x2ae8 */ DWORD unknown002ae8; +/* 0x2aec */ DWORD unknown002aec; +/* 0x2af0 */ DWORD unknown002af0; +/* 0x2af4 */ DWORD unknown002af4; +/* 0x2af8 */ DWORD unknown002af8; +/* 0x2afc */ DWORD unknown002afc; + +/* 0x2b00 */ DWORD unknown002b00; +/* 0x2b04 */ DWORD unknown002b04; +/* 0x2b08 */ DWORD unknown002b08; +/* 0x2b0c */ DWORD unknown002b0c; +/* 0x2b10 */ DWORD unknown002b10; +/* 0x2b14 */ DWORD unknown002b14; +/* 0x2b18 */ DWORD unknown002b18; +/* 0x2b1c */ DWORD unknown002b1c; +/* 0x2b20 */ DWORD unknown002b20; +/* 0x2b24 */ DWORD unknown002b24; +/* 0x2b28 */ DWORD unknown002b28; +/* 0x2b2c */ DWORD unknown002b2c; +/* 0x2b30 */ DWORD unknown002b30; +/* 0x2b34 */ DWORD unknown002b34; +/* 0x2b38 */ DWORD unknown002b38; +/* 0x2b3c */ DWORD unknown002b3c; +/* 0x2b40 */ DWORD unknown002b40; +/* 0x2b44 */ DWORD unknown002b44; +/* 0x2b48 */ DWORD unknown002b48; +/* 0x2b4c */ DWORD unknown002b4c; +/* 0x2b50 */ DWORD unknown002b50; +/* 0x2b54 */ DWORD unknown002b54; +/* 0x2b58 */ DWORD unknown002b58; +/* 0x2b5c */ DWORD unknown002b5c; +/* 0x2b60 */ DWORD unknown002b60; +/* 0x2b64 */ DWORD unknown002b64; +/* 0x2b68 */ DWORD unknown002b68; +/* 0x2b6c */ DWORD unknown002b6c; +/* 0x2b70 */ DWORD unknown002b70; +/* 0x2b74 */ DWORD unknown002b74; +/* 0x2b78 */ DWORD unknown002b78; +/* 0x2b7c */ DWORD unknown002b7c; +/* 0x2b80 */ DWORD unknown002b80; +/* 0x2b84 */ DWORD unknown002b84; +/* 0x2b88 */ DWORD unknown002b88; +/* 0x2b8c */ DWORD unknown002b8c; +/* 0x2b90 */ DWORD unknown002b90; +/* 0x2b94 */ DWORD unknown002b94; +/* 0x2b98 */ DWORD unknown002b98; +/* 0x2b9c */ DWORD unknown002b9c; +/* 0x2ba0 */ DWORD unknown002ba0; +/* 0x2ba4 */ DWORD unknown002ba4; +/* 0x2ba8 */ DWORD unknown002ba8; +/* 0x2bac */ DWORD unknown002bac; +/* 0x2bb0 */ DWORD unknown002bb0; +/* 0x2bb4 */ DWORD unknown002bb4; +/* 0x2bb8 */ DWORD unknown002bb8; +/* 0x2bbc */ DWORD unknown002bbc; +/* 0x2bc0 */ DWORD unknown002bc0; +/* 0x2bc4 */ DWORD unknown002bc4; +/* 0x2bc8 */ DWORD unknown002bc8; +/* 0x2bcc */ DWORD unknown002bcc; +/* 0x2bd0 */ DWORD unknown002bd0; +/* 0x2bd4 */ DWORD unknown002bd4; +/* 0x2bd8 */ DWORD unknown002bd8; +/* 0x2bdc */ DWORD unknown002bdc; +/* 0x2be0 */ DWORD unknown002be0; +/* 0x2be4 */ DWORD unknown002be4; +/* 0x2be8 */ DWORD unknown002be8; +/* 0x2bec */ DWORD unknown002bec; +/* 0x2bf0 */ DWORD unknown002bf0; +/* 0x2bf4 */ DWORD unknown002bf4; +/* 0x2bf8 */ DWORD unknown002bf8; +/* 0x2bfc */ DWORD unknown002bfc; + +/* 0x2c00 */ DWORD unknown002c00; +/* 0x2c04 */ DWORD unknown002c04; +/* 0x2c08 */ DWORD unknown002c08; +/* 0x2c0c */ DWORD unknown002c0c; +/* 0x2c10 */ DWORD unknown002c10; +/* 0x2c14 */ DWORD unknown002c14; +/* 0x2c18 */ DWORD unknown002c18; +/* 0x2c1c */ DWORD unknown002c1c; +/* 0x2c20 */ DWORD unknown002c20; +/* 0x2c24 */ DWORD unknown002c24; +/* 0x2c28 */ DWORD unknown002c28; +/* 0x2c2c */ DWORD unknown002c2c; +/* 0x2c30 */ DWORD unknown002c30; +/* 0x2c34 */ DWORD unknown002c34; +/* 0x2c38 */ DWORD unknown002c38; +/* 0x2c3c */ DWORD unknown002c3c; +/* 0x2c40 */ DWORD unknown002c40; +/* 0x2c44 */ DWORD unknown002c44; +/* 0x2c48 */ DWORD unknown002c48; +/* 0x2c4c */ DWORD unknown002c4c; +/* 0x2c50 */ DWORD unknown002c50; +/* 0x2c54 */ DWORD unknown002c54; +/* 0x2c58 */ DWORD unknown002c58; +/* 0x2c5c */ DWORD unknown002c5c; +/* 0x2c60 */ DWORD unknown002c60; +/* 0x2c64 */ DWORD unknown002c64; +/* 0x2c68 */ DWORD unknown002c68; +/* 0x2c6c */ DWORD unknown002c6c; +/* 0x2c70 */ DWORD unknown002c70; +/* 0x2c74 */ DWORD unknown002c74; +/* 0x2c78 */ DWORD unknown002c78; +/* 0x2c7c */ DWORD unknown002c7c; +/* 0x2c80 */ DWORD unknown002c80; +/* 0x2c84 */ DWORD unknown002c84; +/* 0x2c88 */ DWORD unknown002c88; +/* 0x2c8c */ DWORD unknown002c8c; +/* 0x2c90 */ DWORD unknown002c90; +/* 0x2c94 */ DWORD unknown002c94; +/* 0x2c98 */ DWORD unknown002c98; +/* 0x2c9c */ DWORD unknown002c9c; +/* 0x2ca0 */ DWORD unknown002ca0; +/* 0x2ca4 */ DWORD unknown002ca4; +/* 0x2ca8 */ DWORD unknown002ca8; +/* 0x2cac */ DWORD unknown002cac; +/* 0x2cb0 */ DWORD unknown002cb0; +/* 0x2cb4 */ DWORD unknown002cb4; +/* 0x2cb8 */ DWORD unknown002cb8; +/* 0x2cbc */ DWORD unknown002cbc; +/* 0x2cc0 */ DWORD unknown002cc0; +/* 0x2cc4 */ DWORD unknown002cc4; +/* 0x2cc8 */ DWORD unknown002cc8; +/* 0x2ccc */ DWORD unknown002ccc; +/* 0x2cd0 */ DWORD unknown002cd0; +/* 0x2cd4 */ DWORD unknown002cd4; +/* 0x2cd8 */ DWORD unknown002cd8; +/* 0x2cdc */ DWORD unknown002cdc; +/* 0x2ce0 */ DWORD unknown002ce0; +/* 0x2ce4 */ DWORD unknown002ce4; +/* 0x2ce8 */ DWORD unknown002ce8; +/* 0x2cec */ DWORD unknown002cec; +/* 0x2cf0 */ DWORD unknown002cf0; +/* 0x2cf4 */ DWORD unknown002cf4; +/* 0x2cf8 */ DWORD unknown002cf8; +/* 0x2cfc */ DWORD unknown002cfc; + +/* 0x2d00 */ DWORD unknown002d00; +/* 0x2d04 */ DWORD unknown002d04; +/* 0x2d08 */ DWORD unknown002d08; +/* 0x2d0c */ DWORD unknown002d0c; +/* 0x2d10 */ DWORD unknown002d10; +/* 0x2d14 */ DWORD unknown002d14; +/* 0x2d18 */ DWORD unknown002d18; +/* 0x2d1c */ DWORD unknown002d1c; +/* 0x2d20 */ DWORD unknown002d20; +/* 0x2d24 */ DWORD unknown002d24; +/* 0x2d28 */ DWORD unknown002d28; +/* 0x2d2c */ DWORD unknown002d2c; +/* 0x2d30 */ DWORD unknown002d30; +/* 0x2d34 */ DWORD unknown002d34; +/* 0x2d38 */ DWORD unknown002d38; +/* 0x2d3c */ DWORD unknown002d3c; +/* 0x2d40 */ DWORD unknown002d40; +/* 0x2d44 */ DWORD unknown002d44; +/* 0x2d48 */ DWORD unknown002d48; +/* 0x2d4c */ DWORD unknown002d4c; +/* 0x2d50 */ DWORD unknown002d50; +/* 0x2d54 */ DWORD unknown002d54; +/* 0x2d58 */ DWORD unknown002d58; +/* 0x2d5c */ DWORD unknown002d5c; +/* 0x2d60 */ DWORD unknown002d60; +/* 0x2d64 */ DWORD unknown002d64; +/* 0x2d68 */ DWORD unknown002d68; +/* 0x2d6c */ DWORD unknown002d6c; +/* 0x2d70 */ DWORD unknown002d70; +/* 0x2d74 */ DWORD unknown002d74; +/* 0x2d78 */ DWORD unknown002d78; +/* 0x2d7c */ DWORD unknown002d7c; +/* 0x2d80 */ DWORD unknown002d80; +/* 0x2d84 */ DWORD unknown002d84; +/* 0x2d88 */ DWORD unknown002d88; +/* 0x2d8c */ DWORD unknown002d8c; +/* 0x2d90 */ DWORD unknown002d90; +/* 0x2d94 */ DWORD unknown002d94; +/* 0x2d98 */ DWORD unknown002d98; +/* 0x2d9c */ DWORD unknown002d9c; +/* 0x2da0 */ DWORD unknown002da0; +/* 0x2da4 */ DWORD unknown002da4; +/* 0x2da8 */ DWORD unknown002da8; +/* 0x2dac */ DWORD unknown002dac; +/* 0x2db0 */ DWORD unknown002db0; +/* 0x2db4 */ DWORD unknown002db4; +/* 0x2db8 */ DWORD unknown002db8; +/* 0x2dbc */ DWORD unknown002dbc; +/* 0x2dc0 */ DWORD unknown002dc0; +/* 0x2dc4 */ DWORD unknown002dc4; +/* 0x2dc8 */ DWORD unknown002dc8; +/* 0x2dcc */ DWORD unknown002dcc; +/* 0x2dd0 */ DWORD unknown002dd0; +/* 0x2dd4 */ DWORD unknown002dd4; +/* 0x2dd8 */ DWORD unknown002dd8; +/* 0x2ddc */ DWORD unknown002ddc; +/* 0x2de0 */ DWORD unknown002de0; +/* 0x2de4 */ DWORD unknown002de4; +/* 0x2de8 */ DWORD unknown002de8; +/* 0x2dec */ DWORD unknown002dec; +/* 0x2df0 */ DWORD unknown002df0; +/* 0x2df4 */ DWORD unknown002df4; +/* 0x2df8 */ DWORD unknown002df8; +/* 0x2dfc */ DWORD unknown002dfc; + +/* 0x2e00 */ DWORD unknown002e00; +/* 0x2e04 */ DWORD unknown002e04; +/* 0x2e08 */ DWORD unknown002e08; +/* 0x2e0c */ DWORD unknown002e0c; +/* 0x2e10 */ DWORD unknown002e10; +/* 0x2e14 */ DWORD unknown002e14; +/* 0x2e18 */ DWORD unknown002e18; +/* 0x2e1c */ DWORD unknown002e1c; +/* 0x2e20 */ DWORD unknown002e20; +/* 0x2e24 */ DWORD unknown002e24; +/* 0x2e28 */ DWORD unknown002e28; +/* 0x2e2c */ DWORD unknown002e2c; +/* 0x2e30 */ DWORD unknown002e30; +/* 0x2e34 */ DWORD unknown002e34; +/* 0x2e38 */ DWORD unknown002e38; +/* 0x2e3c */ DWORD unknown002e3c; +/* 0x2e40 */ DWORD unknown002e40; +/* 0x2e44 */ DWORD unknown002e44; +/* 0x2e48 */ DWORD unknown002e48; +/* 0x2e4c */ DWORD unknown002e4c; +/* 0x2e50 */ DWORD unknown002e50; +/* 0x2e54 */ DWORD unknown002e54; +/* 0x2e58 */ DWORD unknown002e58; +/* 0x2e5c */ DWORD unknown002e5c; +/* 0x2e60 */ DWORD unknown002e60; +/* 0x2e64 */ DWORD unknown002e64; +/* 0x2e68 */ DWORD unknown002e68; +/* 0x2e6c */ DWORD unknown002e6c; +/* 0x2e70 */ DWORD unknown002e70; +/* 0x2e74 */ DWORD unknown002e74; +/* 0x2e78 */ DWORD unknown002e78; +/* 0x2e7c */ DWORD unknown002e7c; +/* 0x2e80 */ DWORD unknown002e80; +/* 0x2e84 */ DWORD unknown002e84; +/* 0x2e88 */ DWORD unknown002e88; +/* 0x2e8c */ DWORD unknown002e8c; +/* 0x2e90 */ DWORD unknown002e90; +/* 0x2e94 */ DWORD unknown002e94; +/* 0x2e98 */ DWORD unknown002e98; +/* 0x2e9c */ DWORD unknown002e9c; +/* 0x2ea0 */ DWORD unknown002ea0; +/* 0x2ea4 */ DWORD unknown002ea4; +/* 0x2ea8 */ DWORD unknown002ea8; +/* 0x2eac */ DWORD unknown002eac; +/* 0x2eb0 */ DWORD unknown002eb0; +/* 0x2eb4 */ DWORD unknown002eb4; +/* 0x2eb8 */ DWORD unknown002eb8; +/* 0x2ebc */ DWORD unknown002ebc; +/* 0x2ec0 */ DWORD unknown002ec0; +/* 0x2ec4 */ DWORD unknown002ec4; +/* 0x2ec8 */ DWORD unknown002ec8; +/* 0x2ecc */ DWORD unknown002ecc; +/* 0x2ed0 */ DWORD unknown002ed0; +/* 0x2ed4 */ DWORD unknown002ed4; +/* 0x2ed8 */ DWORD unknown002ed8; +/* 0x2edc */ DWORD unknown002edc; +/* 0x2ee0 */ DWORD unknown002ee0; +/* 0x2ee4 */ DWORD unknown002ee4; +/* 0x2ee8 */ DWORD unknown002ee8; +/* 0x2eec */ DWORD unknown002eec; +/* 0x2ef0 */ DWORD unknown002ef0; +/* 0x2ef4 */ DWORD unknown002ef4; +/* 0x2ef8 */ DWORD unknown002ef8; +/* 0x2efc */ DWORD unknown002efc; + +/* 0x2f00 */ DWORD unknown002f00; +/* 0x2f04 */ DWORD unknown002f04; +/* 0x2f08 */ DWORD unknown002f08; +/* 0x2f0c */ DWORD unknown002f0c; +/* 0x2f10 */ DWORD unknown002f10; +/* 0x2f14 */ DWORD unknown002f14; +/* 0x2f18 */ DWORD unknown002f18; +/* 0x2f1c */ DWORD unknown002f1c; +/* 0x2f20 */ DWORD unknown002f20; +/* 0x2f24 */ DWORD unknown002f24; +/* 0x2f28 */ DWORD unknown002f28; +/* 0x2f2c */ DWORD unknown002f2c; +/* 0x2f30 */ DWORD unknown002f30; +/* 0x2f34 */ DWORD unknown002f34; +/* 0x2f38 */ DWORD unknown002f38; +/* 0x2f3c */ DWORD unknown002f3c; +/* 0x2f40 */ DWORD unknown002f40; +/* 0x2f44 */ DWORD unknown002f44; +/* 0x2f48 */ DWORD unknown002f48; +/* 0x2f4c */ DWORD unknown002f4c; +/* 0x2f50 */ DWORD unknown002f50; +/* 0x2f54 */ DWORD unknown002f54; +/* 0x2f58 */ DWORD unknown002f58; +/* 0x2f5c */ DWORD unknown002f5c; +/* 0x2f60 */ DWORD unknown002f60; +/* 0x2f64 */ DWORD unknown002f64; +/* 0x2f68 */ DWORD unknown002f68; +/* 0x2f6c */ DWORD unknown002f6c; +/* 0x2f70 */ DWORD unknown002f70; +/* 0x2f74 */ DWORD unknown002f74; +/* 0x2f78 */ DWORD unknown002f78; +/* 0x2f7c */ DWORD unknown002f7c; +/* 0x2f80 */ DWORD unknown002f80; +/* 0x2f84 */ DWORD unknown002f84; +/* 0x2f88 */ DWORD unknown002f88; +/* 0x2f8c */ DWORD unknown002f8c; +/* 0x2f90 */ DWORD unknown002f90; +/* 0x2f94 */ DWORD unknown002f94; +/* 0x2f98 */ DWORD unknown002f98; +/* 0x2f9c */ DWORD unknown002f9c; +/* 0x2fa0 */ DWORD unknown002fa0; +/* 0x2fa4 */ DWORD unknown002fa4; +/* 0x2fa8 */ DWORD unknown002fa8; +/* 0x2fac */ DWORD unknown002fac; +/* 0x2fb0 */ DWORD unknown002fb0; +/* 0x2fb4 */ DWORD unknown002fb4; +/* 0x2fb8 */ DWORD unknown002fb8; +/* 0x2fbc */ DWORD unknown002fbc; +/* 0x2fc0 */ DWORD unknown002fc0; +/* 0x2fc4 */ DWORD unknown002fc4; +/* 0x2fc8 */ DWORD unknown002fc8; +/* 0x2fcc */ DWORD unknown002fcc; +/* 0x2fd0 */ DWORD unknown002fd0; +/* 0x2fd4 */ DWORD unknown002fd4; +/* 0x2fd8 */ DWORD unknown002fd8; +/* 0x2fdc */ DWORD unknown002fdc; +/* 0x2fe0 */ DWORD unknown002fe0; +/* 0x2fe4 */ DWORD unknown002fe4; +/* 0x2fe8 */ DWORD unknown002fe8; +/* 0x2fec */ DWORD unknown002fec; +/* 0x2ff0 */ DWORD unknown002ff0; +/* 0x2ff4 */ DWORD unknown002ff4; +/* 0x2ff8 */ DWORD unknown002ff8; +/* 0x2ffc */ DWORD unknown002ffc; + +/* 0x3000 */ DWORD unknown003000; +/* 0x3004 */ DWORD unknown003004; +/* 0x3008 */ DWORD unknown003008; +/* 0x300c */ DWORD unknown00300c; +/* 0x3010 */ DWORD unknown003010; +/* 0x3014 */ DWORD unknown003014; +/* 0x3018 */ DWORD unknown003018; +/* 0x301c */ DWORD unknown00301c; +/* 0x3020 */ DWORD unknown003020; +/* 0x3024 */ DWORD unknown003024; +/* 0x3028 */ DWORD unknown003028; +/* 0x302c */ DWORD unknown00302c; +/* 0x3030 */ DWORD unknown003030; +/* 0x3034 */ DWORD unknown003034; +/* 0x3038 */ DWORD unknown003038; +/* 0x303c */ DWORD unknown00303c; +/* 0x3040 */ DWORD unknown003040; +/* 0x3044 */ DWORD unknown003044; +/* 0x3048 */ DWORD unknown003048; +/* 0x304c */ DWORD unknown00304c; +/* 0x3050 */ DWORD unknown003050; +/* 0x3054 */ DWORD unknown003054; +/* 0x3058 */ DWORD unknown003058; +/* 0x305c */ DWORD unknown00305c; +/* 0x3060 */ DWORD unknown003060; +/* 0x3064 */ DWORD unknown003064; +/* 0x3068 */ DWORD unknown003068; +/* 0x306c */ DWORD unknown00306c; +/* 0x3070 */ DWORD unknown003070; +/* 0x3074 */ DWORD unknown003074; +/* 0x3078 */ DWORD unknown003078; +/* 0x307c */ DWORD unknown00307c; +/* 0x3080 */ DWORD unknown003080; +/* 0x3084 */ DWORD unknown003084; +/* 0x3088 */ DWORD unknown003088; +/* 0x308c */ DWORD unknown00308c; +/* 0x3090 */ DWORD unknown003090; +/* 0x3094 */ DWORD unknown003094; +/* 0x3098 */ DWORD unknown003098; +/* 0x309c */ DWORD unknown00309c; +/* 0x30a0 */ DWORD unknown0030a0; +/* 0x30a4 */ DWORD unknown0030a4; +/* 0x30a8 */ DWORD unknown0030a8; +/* 0x30ac */ DWORD unknown0030ac; +/* 0x30b0 */ DWORD unknown0030b0; +/* 0x30b4 */ DWORD unknown0030b4; +/* 0x30b8 */ DWORD unknown0030b8; +/* 0x30bc */ DWORD unknown0030bc; +/* 0x30c0 */ DWORD unknown0030c0; +/* 0x30c4 */ DWORD unknown0030c4; +/* 0x30c8 */ DWORD unknown0030c8; +/* 0x30cc */ DWORD unknown0030cc; +/* 0x30d0 */ DWORD unknown0030d0; +/* 0x30d4 */ DWORD unknown0030d4; +/* 0x30d8 */ DWORD unknown0030d8; +/* 0x30dc */ DWORD unknown0030dc; +/* 0x30e0 */ DWORD unknown0030e0; +/* 0x30e4 */ DWORD unknown0030e4; +/* 0x30e8 */ DWORD unknown0030e8; +/* 0x30ec */ DWORD unknown0030ec; +/* 0x30f0 */ DWORD unknown0030f0; +/* 0x30f4 */ DWORD unknown0030f4; +/* 0x30f8 */ DWORD unknown0030f8; +/* 0x30fc */ DWORD unknown0030fc; + +/* 0x3100 */ DWORD unknown003100; +/* 0x3104 */ DWORD unknown003104; +/* 0x3108 */ DWORD unknown003108; +/* 0x310c */ DWORD unknown00310c; +/* 0x3110 */ DWORD unknown003110; +/* 0x3114 */ DWORD unknown003114; +/* 0x3118 */ DWORD unknown003118; +/* 0x311c */ DWORD unknown00311c; +/* 0x3120 */ DWORD unknown003120; +/* 0x3124 */ DWORD unknown003124; +/* 0x3128 */ DWORD unknown003128; +/* 0x312c */ DWORD unknown00312c; +/* 0x3130 */ DWORD unknown003130; +/* 0x3134 */ DWORD unknown003134; +/* 0x3138 */ DWORD unknown003138; +/* 0x313c */ DWORD unknown00313c; +/* 0x3140 */ DWORD unknown003140; +/* 0x3144 */ DWORD unknown003144; +/* 0x3148 */ DWORD unknown003148; +/* 0x314c */ DWORD unknown00314c; +/* 0x3150 */ DWORD unknown003150; +/* 0x3154 */ DWORD unknown003154; +/* 0x3158 */ DWORD unknown003158; +/* 0x315c */ DWORD unknown00315c; +/* 0x3160 */ DWORD unknown003160; +/* 0x3164 */ DWORD unknown003164; +/* 0x3168 */ DWORD unknown003168; +/* 0x316c */ DWORD unknown00316c; +/* 0x3170 */ DWORD unknown003170; +/* 0x3174 */ DWORD unknown003174; +/* 0x3178 */ DWORD unknown003178; +/* 0x317c */ DWORD unknown00317c; +/* 0x3180 */ DWORD unknown003180; +/* 0x3184 */ DWORD unknown003184; +/* 0x3188 */ DWORD unknown003188; +/* 0x318c */ DWORD unknown00318c; +/* 0x3190 */ DWORD unknown003190; +/* 0x3194 */ DWORD unknown003194; +/* 0x3198 */ DWORD unknown003198; +/* 0x319c */ DWORD unknown00319c; +/* 0x31a0 */ DWORD unknown0031a0; +/* 0x31a4 */ DWORD unknown0031a4; +/* 0x31a8 */ DWORD unknown0031a8; +/* 0x31ac */ DWORD unknown0031ac; +/* 0x31b0 */ DWORD unknown0031b0; +/* 0x31b4 */ DWORD unknown0031b4; +/* 0x31b8 */ DWORD unknown0031b8; +/* 0x31bc */ DWORD unknown0031bc; +/* 0x31c0 */ DWORD unknown0031c0; +/* 0x31c4 */ DWORD unknown0031c4; +/* 0x31c8 */ DWORD unknown0031c8; +/* 0x31cc */ DWORD unknown0031cc; +/* 0x31d0 */ DWORD unknown0031d0; +/* 0x31d4 */ DWORD unknown0031d4; +/* 0x31d8 */ DWORD unknown0031d8; +/* 0x31dc */ DWORD unknown0031dc; +/* 0x31e0 */ DWORD unknown0031e0; +/* 0x31e4 */ DWORD unknown0031e4; +/* 0x31e8 */ DWORD unknown0031e8; +/* 0x31ec */ DWORD unknown0031ec; +/* 0x31f0 */ DWORD unknown0031f0; +/* 0x31f4 */ DWORD unknown0031f4; +/* 0x31f8 */ DWORD unknown0031f8; +/* 0x31fc */ DWORD unknown0031fc; + +/* 0x3200 */ DWORD unknown003200; +/* 0x3204 */ DWORD unknown003204; +/* 0x3208 */ DWORD unknown003208; +/* 0x320c */ DWORD unknown00320c; +/* 0x3210 */ DWORD unknown003210; +/* 0x3214 */ DWORD unknown003214; +/* 0x3218 */ DWORD unknown003218; +/* 0x321c */ DWORD unknown00321c; +/* 0x3220 */ DWORD unknown003220; +/* 0x3224 */ DWORD unknown003224; +/* 0x3228 */ DWORD unknown003228; +/* 0x322c */ DWORD unknown00322c; +/* 0x3230 */ DWORD unknown003230; +/* 0x3234 */ DWORD unknown003234; +/* 0x3238 */ DWORD unknown003238; +/* 0x323c */ DWORD unknown00323c; +/* 0x3240 */ DWORD unknown003240; +/* 0x3244 */ DWORD unknown003244; +/* 0x3248 */ DWORD unknown003248; +/* 0x324c */ DWORD unknown00324c; +/* 0x3250 */ DWORD unknown003250; +/* 0x3254 */ DWORD unknown003254; +/* 0x3258 */ DWORD unknown003258; +/* 0x325c */ DWORD unknown00325c; +/* 0x3260 */ DWORD unknown003260; +/* 0x3264 */ DWORD unknown003264; +/* 0x3268 */ DWORD unknown003268; +/* 0x326c */ DWORD unknown00326c; +/* 0x3270 */ DWORD unknown003270; +/* 0x3274 */ DWORD unknown003274; +/* 0x3278 */ DWORD unknown003278; +/* 0x327c */ DWORD unknown00327c; +/* 0x3280 */ DWORD unknown003280; +/* 0x3284 */ DWORD unknown003284; +/* 0x3288 */ DWORD unknown003288; +/* 0x328c */ DWORD unknown00328c; +/* 0x3290 */ DWORD unknown003290; +/* 0x3294 */ DWORD unknown003294; +/* 0x3298 */ DWORD unknown003298; +/* 0x329c */ DWORD unknown00329c; +/* 0x32a0 */ DWORD unknown0032a0; +/* 0x32a4 */ DWORD unknown0032a4; +/* 0x32a8 */ DWORD unknown0032a8; +/* 0x32ac */ DWORD unknown0032ac; +/* 0x32b0 */ DWORD unknown0032b0; +/* 0x32b4 */ DWORD unknown0032b4; +/* 0x32b8 */ DWORD unknown0032b8; +/* 0x32bc */ DWORD unknown0032bc; +/* 0x32c0 */ DWORD unknown0032c0; +/* 0x32c4 */ DWORD unknown0032c4; +/* 0x32c8 */ DWORD unknown0032c8; +/* 0x32cc */ DWORD unknown0032cc; +/* 0x32d0 */ DWORD unknown0032d0; +/* 0x32d4 */ DWORD unknown0032d4; +/* 0x32d8 */ DWORD unknown0032d8; +/* 0x32dc */ DWORD unknown0032dc; +/* 0x32e0 */ DWORD unknown0032e0; +/* 0x32e4 */ DWORD unknown0032e4; +/* 0x32e8 */ DWORD unknown0032e8; +/* 0x32ec */ DWORD unknown0032ec; +/* 0x32f0 */ DWORD unknown0032f0; +/* 0x32f4 */ DWORD unknown0032f4; +/* 0x32f8 */ DWORD unknown0032f8; +/* 0x32fc */ DWORD unknown0032fc; + +/* 0x3300 */ DWORD unknown003300; +/* 0x3304 */ DWORD unknown003304; +/* 0x3308 */ DWORD unknown003308; +/* 0x330c */ DWORD unknown00330c; +/* 0x3310 */ DWORD unknown003310; +/* 0x3314 */ DWORD unknown003314; +/* 0x3318 */ DWORD unknown003318; +/* 0x331c */ DWORD unknown00331c; +/* 0x3320 */ DWORD unknown003320; +/* 0x3324 */ DWORD unknown003324; +/* 0x3328 */ DWORD unknown003328; +/* 0x332c */ DWORD unknown00332c; +} D3D9HALDEVICE_INT, FAR *LPD3D9HALDEVICE_INT; + +#endif /* _D3D9_DEVICE_H_ */ Propchange: trunk/reactos/dll/directx/d3d9/d3d9_device.h ------------------------------------------------------------------------------ svn:eol-style = native Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_priv…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] Thu Apr 24 14:57:41 2008 @@ -59,7 +59,7 @@ /* 0x00b0 */ DWORD dwUnknown00b0; /* 0x00b4 */ DWORD dwUnknown00b4; /* 0x00b8 */ DWORD dwUnknown00b8; -/* 0x00BC */ DDGAMMARAMP lpGammaRamp; +/* 0x00BC */ DDGAMMARAMP GammaRamp; } D3D9_Unknown6BC; typedef struct _tagD3D9_DRIVERCAPS
16 years, 8 months
1
0
0
0
[gbrunmar] 33131: Renamed internal Direct3D9 structure to make more sense
by gbrunmar@svn.reactos.org
Author: gbrunmar Date: Thu Apr 24 13:29:50 2008 New Revision: 33131 URL:
http://svn.reactos.org/svn/reactos?rev=33131&view=rev
Log: Renamed internal Direct3D9 structure to make more sense Modified: trunk/reactos/dll/directx/d3d9/d3d9_caps.c trunk/reactos/dll/directx/d3d9/d3d9_caps.h trunk/reactos/dll/directx/d3d9/d3d9_create.c trunk/reactos/dll/directx/d3d9/d3d9_private.h Modified: trunk/reactos/dll/directx/d3d9/d3d9_caps.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_caps…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_caps.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_caps.c [iso-8859-1] Thu Apr 24 13:29:50 2008 @@ -157,7 +157,7 @@ else { D3D9_DRIVERCAPS DriverCaps; - D3D9_UnknownA8h unknownA8h; + D3D9_CALLBACKS D3D9Callbacks; if (FALSE == CanReenableDirectDrawObject(pDeviceData->pUnknown6BC)) { @@ -168,7 +168,7 @@ bRet = GetD3D9DriverInfo( pDeviceData->pUnknown6BC, &DriverCaps, - &unknownA8h, + &D3D9Callbacks, pDeviceData->szDeviceName, pDeviceData->hD3DRefDll, &GlobalDriverData, @@ -222,7 +222,7 @@ bRet = GetD3D9DriverInfo( pDeviceData->pUnknown6BC, &pDeviceData->DriverCaps, - &pDeviceData->_UnknownA8h, + &pDeviceData->D3D9Callbacks, pDeviceData->szDeviceName, pDeviceData->hD3DRefDll, &GlobalDriverData, @@ -252,7 +252,7 @@ bRet = GetD3D9DriverInfo( pDeviceData->pUnknown6BC, &pDeviceData->DriverCaps, - &pDeviceData->_UnknownA8h, + &pDeviceData->D3D9Callbacks, pDeviceData->szDeviceName, pDeviceData->hD3DRefDll, &GlobalDriverData, @@ -334,7 +334,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC* pUnknown6BC, LPD3D9_DRIVERCAPS pDriverCaps, - D3D9_UnknownA8h* pUnknownA8h, + D3D9_CALLBACKS* pD3D9Callbacks, LPCSTR lpszDeviceName, HMODULE hD3dRefDll, D3DHAL_GLOBALDRIVERDATA* pGblDriverData, Modified: trunk/reactos/dll/directx/d3d9/d3d9_caps.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_caps…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_caps.h [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_caps.h [iso-8859-1] Thu Apr 24 13:29:50 2008 @@ -22,7 +22,7 @@ BOOL GetD3D9DriverInfo( D3D9_Unknown6BC* pUnknown6BC, LPD3D9_DRIVERCAPS pDriverCaps, - D3D9_UnknownA8h* pUnknownA8h, + D3D9_CALLBACKS* pD3D9Callbacks, LPCSTR lpszDeviceName, HMODULE hD3dRefDll, D3DHAL_GLOBALDRIVERDATA* pGblDriverData, Modified: trunk/reactos/dll/directx/d3d9/d3d9_create.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_crea…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_create.c [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_create.c [iso-8859-1] Thu Apr 24 13:29:50 2008 @@ -139,11 +139,11 @@ if (pDisplayAdapter->bInUseFlag) { - pDeviceData->_UnknownA8h.DeviceType = D3DDEVTYPE_HAL; + pDeviceData->D3D9Callbacks.DeviceType = D3DDEVTYPE_HAL; } else if (IsGDIDriver(hDC)) { - pDeviceData->_UnknownA8h.DeviceType = D3DDEVTYPE_REF; + pDeviceData->D3D9Callbacks.DeviceType = D3DDEVTYPE_REF; } if (FALSE == GetDeviceData(pDeviceData)) Modified: trunk/reactos/dll/directx/d3d9/d3d9_private.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/directx/d3d9/d3d9_priv…
============================================================================== --- trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] (original) +++ trunk/reactos/dll/directx/d3d9/d3d9_private.h [iso-8859-1] Thu Apr 24 13:29:50 2008 @@ -26,6 +26,7 @@ /* 0x0030 */ DWORD dwUnknown0030; /* 0x0034 */ ULONG DeviceUniq; /* 0x0038 */ DWORD dwUnknown0038; +/* 0x003c */ DWORD dwUnknown003c; /* 0x0040 */ D3DFORMAT RawDisplayFormat; /* 0x0044 */ D3DFORMAT DisplayFormat; /* 0x0048 */ LONG lDisplayPitch; @@ -84,7 +85,7 @@ /* 0x0174 */ D3DQUERYTYPE* pSupportedQueriesList; } D3D9_DRIVERCAPS, FAR *LPD3D9_DRIVERCAPS; -typedef struct _tagUnknownA8h_ +typedef struct _tagD3D9_CALLBACKS { /* 0x0000 */ DWORD DdCreateSurface; /* 0x0004 */ DWORD DdDestroySurface; @@ -128,12 +129,12 @@ /* 0x009c */ DWORD DXVAExecute; /* 0x00a0 */ DWORD DXVAQueryStatus; /* 0x00a4 */ D3DDEVTYPE DeviceType; -} D3D9_UnknownA8h; +} D3D9_CALLBACKS; typedef struct _tagD3D9_DEVICEDATA_ { /* 0x0000 */ D3D9_DRIVERCAPS DriverCaps; -/* 0x0178 */ D3D9_UnknownA8h _UnknownA8h; +/* 0x0178 */ D3D9_CALLBACKS D3D9Callbacks; /* 0x0220 */ CHAR szDeviceName[CCHDEVICENAME]; /* 0x0240 */ HDC hDC; /* 0x0244 */ GUID DisplayGuid;
16 years, 8 months
1
0
0
0
[cfinck] 33130: kbswitch: - Revert some changes from r33106: * Set the size of szTempLCID back to CCH_LAYOUT_ID + 1, a layout ID mustn't be longer than this. As we pass the correct size to the Registry functions as well, there can be no buffer overflow. MAX_PATH was probably used here, because input.dll had a bug as well, so that it saved the layout ID with the wrong length. * Use wsprintf over _stprintf * Pass the correct value to dwBufLen (in bytes, not in TCHAR's!) - Add back SystemParameters
by cfinck@svn.reactos.org
Author: cfinck Date: Thu Apr 24 12:57:48 2008 New Revision: 33130 URL:
http://svn.reactos.org/svn/reactos?rev=33130&view=rev
Log: kbswitch: - Revert some changes from r33106: * Set the size of szTempLCID back to CCH_LAYOUT_ID + 1, a layout ID mustn't be longer than this. As we pass the correct size to the Registry functions as well, there can be no buffer overflow. MAX_PATH was probably used here, because input.dll had a bug as well, so that it saved the layout ID with the wrong length. * Use wsprintf over _stprintf * Pass the correct value to dwBufLen (in bytes, not in TCHAR's!) - Add back SystemParametersInfo, so that the system gets to know about the keyboard layout change. EnumWindows is still used for setting the new keyboard layout to all existing Windows. - Don't show a different menu for left and right clicks, that's not how most popup menus work under Windows. Instead append all menu items from the menu template to the popup menu. - Call SetForegroundWindow before and post a WM_NULL message after calling TrackPopupMenu, so that the popup menu will be closed, when the user clicks somewhere else - Fix indentation input.dll: - Fix some incorrect lengths passed to other functions - Get rid of some unneeded variables - Always use the 32-bit Registry functions over the old 16-bit deprecated ones - Fix some other stuff here and there Modified: trunk/reactos/base/applications/kbswitch/kbswitch.c trunk/reactos/base/applications/kbswitch/lang/de-DE.rc trunk/reactos/base/applications/kbswitch/lang/en-US.rc trunk/reactos/base/applications/kbswitch/lang/ru-RU.rc trunk/reactos/base/applications/kbswitch/resource.h trunk/reactos/dll/cpl/input/add.c trunk/reactos/dll/cpl/input/input.h trunk/reactos/dll/cpl/input/settings.c Modified: trunk/reactos/base/applications/kbswitch/kbswitch.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/kbswitch…
============================================================================== --- trunk/reactos/base/applications/kbswitch/kbswitch.c [iso-8859-1] (original) +++ trunk/reactos/base/applications/kbswitch/kbswitch.c [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -11,7 +11,7 @@ #define WM_NOTIFYICONMSG (WM_USER + 248) HINSTANCE hInst; -HWND hwnd; +HANDLE hProcessHeap; static VOID AddTrayIcon(HWND hwnd, HICON hIcon) @@ -46,15 +46,17 @@ GetLayoutID(LPTSTR szLayoutNum, LPTSTR szLCID) { DWORD dwBufLen; + DWORD dwRes; HKEY hKey; - TCHAR szTempLCID[MAX_PATH]; + TCHAR szTempLCID[CCH_LAYOUT_ID + 1]; // Get the Layout ID if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwBufLen = MAX_PATH; - - if (RegQueryValueEx(hKey, szLayoutNum, NULL, NULL, (LPBYTE)szTempLCID, &dwBufLen) != ERROR_SUCCESS) + dwBufLen = sizeof(szTempLCID); + dwRes = RegQueryValueEx(hKey, szLayoutNum, NULL, NULL, (LPBYTE)szTempLCID, &dwBufLen); + + if (dwRes != ERROR_SUCCESS) { RegCloseKey(hKey); return FALSE; @@ -66,7 +68,7 @@ // Look for a substitude of this layout if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Substitutes"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwBufLen = MAX_PATH; + dwBufLen = sizeof(szTempLCID); if (RegQueryValueEx(hKey, szTempLCID, NULL, NULL, (LPBYTE)szLCID, &dwBufLen) != ERROR_SUCCESS) { @@ -96,11 +98,11 @@ if(!GetLayoutID(szLayoutNum, szLCID)) return FALSE; - _stprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLCID); + wsprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLCID); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwBufLen = MAX_PATH; + dwBufLen = MAX_PATH * sizeof(TCHAR); if(RegQueryValueEx(hKey, _T("Layout Text"), NULL, NULL, (LPBYTE)szName, &dwBufLen) != ERROR_SUCCESS) { @@ -133,20 +135,25 @@ // Switch to the new keyboard layout hKl = LoadKeyboardLayout(szLCID, KLF_ACTIVATE); - EnumWindows(EnumWindowsProc, (LPARAM) hKl); + SystemParametersInfo(SPI_SETDEFAULTINPUTLANG, 0, &hKl, SPIF_SENDWININICHANGE); + EnumWindows(EnumWindowsProc, (LPARAM) hKl); } static HMENU BuildPopupMenu() { HMENU hMenu; + HMENU hMenuTemplate; HKEY hKey; DWORD dwIndex, dwSize; + LPTSTR pszMenuItem; + MENUITEMINFO mii; TCHAR szLayoutNum[CCH_ULONG_DEC + 1]; TCHAR szName[MAX_PATH]; hMenu = CreatePopupMenu(); + // Add the keyboard layouts to the popup menu if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { for(dwIndex = 0; ; dwIndex++) @@ -164,17 +171,38 @@ RegCloseKey(hKey); } + // Add the menu items from the popup menu template + hMenuTemplate = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(IDR_POPUP)), 0); + dwIndex = 0; + + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_FTYPE | MIIM_STRING | MIIM_ID; + mii.dwTypeData = NULL; + + while(GetMenuItemInfo(hMenuTemplate, dwIndex, TRUE, &mii)) + { + if(mii.cch > 0) + { + mii.cch++; + pszMenuItem = (LPTSTR)HeapAlloc(hProcessHeap, 0, mii.cch * sizeof(TCHAR)); + + mii.dwTypeData = pszMenuItem; + GetMenuItemInfo(hMenuTemplate, dwIndex, TRUE, &mii); + + AppendMenu(hMenu, mii.fType, mii.wID, mii.dwTypeData); + + HeapFree(hProcessHeap, 0, pszMenuItem); + mii.dwTypeData = NULL; + } + else + { + AppendMenu(hMenu, mii.fType, 0, NULL); + } + + dwIndex++; + } + return hMenu; -} - -static VOID -ShowRightPopupMenu(HWND hwnd, POINT pt) -{ - HMENU hMenu; - - hMenu = GetSubMenu(LoadMenu(hInst, MAKEINTRESOURCE(IDR_POPUP)), 0); - TrackPopupMenu(hMenu, 0, pt.x, pt.y, 0, hwnd, NULL); - DestroyMenu(hMenu); } LRESULT CALLBACK @@ -192,54 +220,47 @@ case WM_NOTIFYICONMSG: switch (lParam) { - case WM_LBUTTONDBLCLK: case WM_LBUTTONDOWN: + case WM_RBUTTONDOWN: { POINT pt; GetCursorPos(&pt); + SetForegroundWindow(hwnd); TrackPopupMenu(hPopupMenu, 0, pt.x, pt.y, 0, hwnd, NULL); + PostMessage(hwnd, WM_NULL, 0, 0); + break; } - break; - case WM_RBUTTONDOWN: - { - POINT pt; - - GetCursorPos(&pt); - ShowRightPopupMenu(hwnd, pt); - } - break; } break; case WM_COMMAND: - switch (LOWORD(wParam)) - { - case ID_EXIT: - SendMessage(hwnd, WM_CLOSE, 0, 0); - break; - - case ID_PROFERENCES: - { - SHELLEXECUTEINFO shInputDll; - - memset(&shInputDll, 0x0, sizeof(SHELLEXECUTEINFO)); + switch (LOWORD(wParam)) + { + case ID_EXIT: + SendMessage(hwnd, WM_CLOSE, 0, 0); + break; + + case ID_PREFERENCES: + { + SHELLEXECUTEINFO shInputDll = {0}; + shInputDll.cbSize = sizeof(shInputDll); shInputDll.hwnd = hwnd; shInputDll.lpVerb = _T("open"); shInputDll.lpFile = _T("RunDll32.exe"); shInputDll.lpParameters = _T("shell32.dll,Control_RunDLL input.dll"); - if (ShellExecuteEx(&shInputDll) == 0) - { + + if (!ShellExecuteEx(&shInputDll)) MessageBox(hwnd, _T("Can't start input.dll"), NULL, MB_OK | MB_ICONERROR); - } - } - break; - - default: - ActivateLayout(LOWORD(wParam)); - break; - } + + break; + } + + default: + ActivateLayout(LOWORD(wParam)); + break; + } break; case WM_DESTROY: @@ -253,12 +274,13 @@ } INT WINAPI -wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow) +_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInst, LPTSTR lpCmdLine, INT nCmdShow) { WNDCLASS WndClass = {0}; MSG msg; hInst = hInstance; + hProcessHeap = GetProcessHeap(); WndClass.style = 0; WndClass.lpfnWndProc = (WNDPROC)WndProc; @@ -271,9 +293,10 @@ WndClass.lpszMenuName = NULL; WndClass.lpszClassName = _T("kbswitch"); - if (!RegisterClass(&WndClass)) return 0; - - hwnd = CreateWindow(_T("kbswitch"), _T("kbswitch"), 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL); + if (!RegisterClass(&WndClass)) + return 1; + + CreateWindow(_T("kbswitch"), NULL, 0, 0, 0, 1, 1, HWND_DESKTOP, NULL, hInstance, NULL); while(GetMessage(&msg,NULL,0,0)) { Modified: trunk/reactos/base/applications/kbswitch/lang/de-DE.rc URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/kbswitch…
============================================================================== --- trunk/reactos/base/applications/kbswitch/lang/de-DE.rc [iso-8859-1] (original) +++ trunk/reactos/base/applications/kbswitch/lang/de-DE.rc [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -4,8 +4,8 @@ BEGIN POPUP "popup" BEGIN - MENUITEM "&Preferences...", ID_PROFERENCES MENUITEM SEPARATOR - MENUITEM "&Beenden", ID_EXIT + MENUITEM "&Einstellungen...", ID_PREFERENCES + MENUITEM "&Beenden", ID_EXIT END END Modified: trunk/reactos/base/applications/kbswitch/lang/en-US.rc URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/kbswitch…
============================================================================== --- trunk/reactos/base/applications/kbswitch/lang/en-US.rc [iso-8859-1] (original) +++ trunk/reactos/base/applications/kbswitch/lang/en-US.rc [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -4,8 +4,8 @@ BEGIN POPUP "popup" BEGIN - MENUITEM "&Preferences...", ID_PROFERENCES MENUITEM SEPARATOR + MENUITEM "&Preferences...", ID_PREFERENCES MENUITEM "&Exit", ID_EXIT END END Modified: trunk/reactos/base/applications/kbswitch/lang/ru-RU.rc URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/kbswitch…
============================================================================== --- trunk/reactos/base/applications/kbswitch/lang/ru-RU.rc [iso-8859-1] (original) +++ trunk/reactos/base/applications/kbswitch/lang/ru-RU.rc [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -4,8 +4,8 @@ BEGIN POPUP "popup" BEGIN - MENUITEM "&Ïàðàìåòðû...", ID_PROFERENCES MENUITEM SEPARATOR + MENUITEM "&Ïàðàìåòðû...", ID_PREFERENCES MENUITEM "&Âûõîä", ID_EXIT END END Modified: trunk/reactos/base/applications/kbswitch/resource.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/base/applications/kbswitch…
============================================================================== --- trunk/reactos/base/applications/kbswitch/resource.h [iso-8859-1] (original) +++ trunk/reactos/base/applications/kbswitch/resource.h [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -6,4 +6,4 @@ /* Menu items */ #define ID_EXIT 10001 -#define ID_PROFERENCES 10002 +#define ID_PREFERENCES 10002 Modified: trunk/reactos/dll/cpl/input/add.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/input/add.c?rev=33…
============================================================================== --- trunk/reactos/dll/cpl/input/add.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/input/add.c [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -18,16 +18,16 @@ static VOID SelectLayoutByLang(VOID) { - TCHAR Layout[MAX_PATH], Lang[MAX_PATH], LangID[MAX_PATH]; + TCHAR Layout[MAX_PATH], Lang[MAX_PATH], LangID[CCH_LAYOUT_ID + 1]; INT iIndex; LCID Lcid; iIndex = SendMessage(hLangList, CB_GETCURSEL, 0, 0); Lcid = SendMessage(hLangList, CB_GETITEMDATA, iIndex, 0); - GetLocaleInfo(MAKELCID(Lcid, SORT_DEFAULT), LOCALE_ILANGUAGE, (WORD*)Lang, sizeof(Lang)); - - _stprintf(LangID, _T("0000%s"), Lang); + GetLocaleInfo(MAKELCID(Lcid, SORT_DEFAULT), LOCALE_ILANGUAGE, Lang, sizeof(Lang) / sizeof(TCHAR)); + + wsprintf(LangID, _T("0000%s"), Lang); if (GetLayoutName(LangID, Layout)) { @@ -39,7 +39,7 @@ static VOID AddNewLayout(HWND hwndDlg) { - TCHAR NewLayout[3]; + TCHAR NewLayout[CCH_ULONG_DEC + 1]; INT iLayout; HKEY hKey; DWORD cValues; @@ -48,11 +48,11 @@ iLayout = SendMessage(hLayoutList, CB_GETCURSEL, 0, 0); if (iLayout == CB_ERR) return; - if (RegOpenKey(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), &hKey) == ERROR_SUCCESS) + if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &hKey) == ERROR_SUCCESS) { if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &cValues, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) { - _stprintf(NewLayout, _T("%d"), cValues + 1); + _ultot(cValues + 1, NewLayout, 10); pts = (PTSTR) SendMessage(hLayoutList, CB_GETITEMDATA, iLayout, 0); @@ -61,7 +61,7 @@ 0, REG_SZ, (LPBYTE)pts, - (DWORD)(_tcslen(pts)*sizeof(PTSTR))) == ERROR_SUCCESS) + (DWORD)((CCH_LAYOUT_ID + 1) * sizeof(TCHAR))) == ERROR_SUCCESS) { UpdateLayoutsList(); } @@ -73,47 +73,48 @@ CreateKeyboardLayoutList(VOID) { HKEY hKey, hSubKey; - PTSTR pstrBuf; - TCHAR szBuf[CCH_LAYOUT_ID + 1], KeyName[MAX_PATH]; - LONG Ret; + PTSTR pstrLayoutID; + TCHAR szLayoutID[CCH_LAYOUT_ID + 1], KeyName[MAX_PATH]; DWORD dwIndex = 0; - - if (RegOpenKey(HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), &hKey) == ERROR_SUCCESS) - { - Ret = RegEnumKey(hKey, dwIndex, szBuf, sizeof(szBuf) / sizeof(TCHAR)); - - while (Ret == ERROR_SUCCESS) - { - _stprintf(KeyName, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szBuf); - - if (RegOpenKey(HKEY_LOCAL_MACHINE, KeyName, &hSubKey) == ERROR_SUCCESS) + DWORD dwSize; + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts"), 0, KEY_ENUMERATE_SUB_KEYS, &hKey) == ERROR_SUCCESS) + { + dwSize = sizeof(szLayoutID) / sizeof(TCHAR); + + while (RegEnumKeyEx(hKey, dwIndex, szLayoutID, &dwSize, NULL, NULL, NULL, NULL) == ERROR_SUCCESS) + { + wsprintf(KeyName, _T("System\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), szLayoutID); + + if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, KeyName, 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) { - DWORD Length = MAX_PATH; - - if (RegQueryValueEx(hSubKey, _T("Layout Text"), NULL, NULL, (LPBYTE)KeyName, &Length) == ERROR_SUCCESS) + DWORD dwKeyNameSize = sizeof(KeyName); + + if (RegQueryValueEx(hSubKey, _T("Layout Text"), NULL, NULL, (LPBYTE)KeyName, &dwKeyNameSize) == ERROR_SUCCESS) { INT iIndex = (INT) SendMessage(hLayoutList, CB_ADDSTRING, 0, (LPARAM)KeyName); - pstrBuf = (PTSTR)HeapAlloc(hProcessHeap, 0, (CCH_LAYOUT_ID + 1) * sizeof(TCHAR)); - _tcscpy(pstrBuf, szBuf); - SendMessage(hLayoutList, CB_SETITEMDATA, iIndex, (LPARAM)pstrBuf); + pstrLayoutID = (PTSTR)HeapAlloc(hProcessHeap, 0, sizeof(szLayoutID)); + lstrcpy(pstrLayoutID, szLayoutID); + SendMessage(hLayoutList, CB_SETITEMDATA, iIndex, (LPARAM)pstrLayoutID); // FIXME! - if (_tcscmp(szBuf, _T("00000409")) == 0) + if (_tcscmp(szLayoutID, _T("00000409")) == 0) { SendMessage(hLayoutList, CB_SETCURSEL, (WPARAM)iIndex, (LPARAM)0); } dwIndex++; - Ret = RegEnumKey(hKey, dwIndex, szBuf, sizeof(szBuf) / sizeof(TCHAR)); - } + } + + RegCloseKey(hSubKey); } - RegCloseKey(hSubKey); - } - } - - RegCloseKey(hKey); + dwSize = sizeof(szLayoutID) / sizeof(TCHAR); + } + + RegCloseKey(hKey); + } } /* Language enumerate procedure */ Modified: trunk/reactos/dll/cpl/input/input.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/input/input.h?rev=…
============================================================================== --- trunk/reactos/dll/cpl/input/input.h [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/input/input.h [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -26,6 +26,9 @@ // Character Count of a layout ID like "00000409" #define CCH_LAYOUT_ID 8 + +// Maximum Character Count of a ULONG in decimal +#define CCH_ULONG_DEC 10 /* input.c */ VOID Modified: trunk/reactos/dll/cpl/input/settings.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/cpl/input/settings.c?r…
============================================================================== --- trunk/reactos/dll/cpl/input/settings.c [iso-8859-1] (original) +++ trunk/reactos/dll/cpl/input/settings.c [iso-8859-1] Thu Apr 24 12:57:48 2008 @@ -12,8 +12,6 @@ #include "resource.h" #include "input.h" -#define BUFSIZE 256 - static HWND MainDlgWnd; typedef struct @@ -21,9 +19,8 @@ LANGID LangId; TCHAR LangName[MAX_PATH]; TCHAR LayoutName[MAX_PATH]; - TCHAR ValName[MAX_PATH]; + TCHAR ValName[CCH_ULONG_DEC + 1]; TCHAR IndName[MAX_PATH]; - TCHAR SubName[MAX_PATH]; } LAYOUT_ITEM, *LPLAYOUT_ITEM; BOOL @@ -31,14 +28,15 @@ { HKEY hKey; DWORD dwBufLen; - TCHAR szBuf[BUFSIZE]; - - _stprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"),lcid); + TCHAR szBuf[MAX_PATH]; + + wsprintf(szBuf, _T("SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\%s"), lcid); if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)szBuf, 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwBufLen = BUFSIZE; - if (RegQueryValueEx(hKey,_T("Layout Text"),NULL,NULL,(LPBYTE)name,&dwBufLen) == ERROR_SUCCESS) + dwBufLen = sizeof(szBuf); + + if (RegQueryValueEx(hKey, _T("Layout Text"), NULL, NULL, (LPBYTE)name, &dwBufLen) == ERROR_SUCCESS) { RegCloseKey(hKey); return TRUE; @@ -78,90 +76,71 @@ (VOID) ListView_InsertColumn(hList, 2, &column); } -static BOOL +static VOID InitLangList(HWND hWnd) { HKEY hKey, hSubKey; - TCHAR szBuf[MAX_PATH], szPreload[MAX_PATH], szSub[MAX_PATH]; + TCHAR szBuf[MAX_PATH], szPreload[CCH_LAYOUT_ID + 1], szSub[CCH_LAYOUT_ID + 1]; LAYOUT_ITEM lItem; - LONG Ret; DWORD dwIndex = 0, dwType, dwSize; - LV_ITEM item; + LV_ITEM item = {0}; HWND hList = GetDlgItem(hWnd, IDC_KEYLAYOUT_LIST); INT i; - + + item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; + if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Preload"), 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS) { - dwSize = MAX_PATH; - Ret = RegEnumValue(hKey, dwIndex, szBuf, &dwSize, NULL, &dwType, NULL, NULL); - if (Ret == ERROR_SUCCESS) - { - while (Ret == ERROR_SUCCESS) - { - _tcscpy(lItem.ValName, szBuf); - - dwSize = MAX_PATH; - RegQueryValueEx(hKey, szBuf, NULL, NULL, (LPBYTE)szPreload, &dwSize); - - lItem.LangId = _tcstoul(szPreload, NULL, 16); - - GetLocaleInfo(lItem.LangId, LOCALE_SISO639LANGNAME, (LPTSTR) szBuf, sizeof(szBuf)); - _tcscpy(lItem.IndName, _tcsupr(szBuf)); - - GetLocaleInfo(lItem.LangId, LOCALE_SLANGUAGE, (LPTSTR)szBuf, sizeof(szBuf)); - _tcscpy(lItem.LangName, szBuf); - - if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Substitutes"), - 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) + dwSize = sizeof(lItem.ValName); + + while (RegEnumValue(hKey, dwIndex, lItem.ValName, &dwSize, NULL, &dwType, NULL, NULL) == ERROR_SUCCESS) + { + dwSize = sizeof(szPreload); + RegQueryValueEx(hKey, lItem.ValName, NULL, NULL, (LPBYTE)szPreload, &dwSize); + + lItem.LangId = (LANGID)_tcstoul(szPreload, NULL, 16); + + GetLocaleInfo(lItem.LangId, LOCALE_SISO639LANGNAME, (LPTSTR)szBuf, sizeof(szBuf) / sizeof(TCHAR)); + lstrcpy(lItem.IndName, _tcsupr(szBuf)); + + GetLocaleInfo(lItem.LangId, LOCALE_SLANGUAGE, (LPTSTR)szBuf, sizeof(szBuf) / sizeof(TCHAR)); + lstrcpy(lItem.LangName, szBuf); + + // Does this keyboard layout have a substitute? + // Then add the substitute instead of the Layout ID + if (RegOpenKeyEx(HKEY_CURRENT_USER, _T("Keyboard Layout\\Substitutes"), + 0, KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) + { + dwSize = sizeof(szSub); + + if (RegQueryValueEx(hSubKey, szPreload, NULL, NULL, (LPBYTE)szSub, &dwSize) == ERROR_SUCCESS) { - dwSize = MAX_PATH; - if (RegQueryValueEx(hSubKey, szPreload, NULL, NULL, (LPBYTE)szSub, &dwSize) == ERROR_SUCCESS) - { - _tcscpy(lItem.SubName, szPreload); - if (GetLayoutName(szSub, szBuf)) - { - _tcscpy(lItem.LayoutName, szBuf); - } - } - else - { - _tcscpy(lItem.SubName, _T("")); - } + lstrcpy(szPreload, szSub); } - if (_tcslen(lItem.SubName) < 2) - { - if (GetLayoutName(szPreload, szBuf)) - { - _tcscpy(lItem.LayoutName, szBuf); - } - } - - ZeroMemory(&item, sizeof(LV_ITEM)); - item.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; - item.pszText = lItem.IndName; - item.lParam = (LPARAM)&lItem; - item.iItem = (INT) dwIndex; - i = ListView_InsertItem(hList, &item); - - ListView_SetItemText(hList, i, 1, lItem.LangName); - ListView_SetItemText(hList, i, 2, lItem.LayoutName); - - dwIndex++; - Ret = RegEnumValue(hKey, dwIndex, szBuf, &dwSize, NULL, &dwType, NULL, NULL); RegCloseKey(hSubKey); - - if (_tcscmp(lItem.ValName, _T("1")) == 0) - { - (VOID) ListView_SetHotItem(hList, i); - } - } - } - } - - RegCloseKey(hKey); - return TRUE; + } + + GetLayoutName(szPreload, lItem.LayoutName); + + item.pszText = lItem.IndName; + item.iItem = (INT) dwIndex; + i = ListView_InsertItem(hList, &item); + + ListView_SetItemText(hList, i, 1, lItem.LangName); + ListView_SetItemText(hList, i, 2, lItem.LayoutName); + + dwIndex++; + + if (lstrcmp(lItem.ValName, _T("1")) == 0) + { + (VOID) ListView_SetHotItem(hList, i); + } + } + + RegCloseKey(hKey); + } } VOID
16 years, 8 months
1
0
0
0
[fireball] 33129: - Reformat Se code and put functions to more appropriate locations.
by fireball@svn.reactos.org
Author: fireball Date: Wed Apr 23 15:38:37 2008 New Revision: 33129 URL:
http://svn.reactos.org/svn/reactos?rev=33129&view=rev
Log: - Reformat Se code and put functions to more appropriate locations. Removed: trunk/reactos/ntoskrnl/se/luid.c Modified: trunk/reactos/ntoskrnl/ex/uuid.c trunk/reactos/ntoskrnl/include/internal/se.h trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild trunk/reactos/ntoskrnl/se/access.c (contents, props changed) trunk/reactos/ntoskrnl/se/acl.c trunk/reactos/ntoskrnl/se/audit.c trunk/reactos/ntoskrnl/se/lsa.c trunk/reactos/ntoskrnl/se/priv.c trunk/reactos/ntoskrnl/se/sd.c trunk/reactos/ntoskrnl/se/semgr.c trunk/reactos/ntoskrnl/se/sid.c trunk/reactos/ntoskrnl/se/token.c [This mail would be too long, it was shortened to contain the URLs only.] Modified: trunk/reactos/ntoskrnl/ex/uuid.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ex/uuid.c?rev=331…
Modified: trunk/reactos/ntoskrnl/include/internal/se.h URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/…
Modified: trunk/reactos/ntoskrnl/ntoskrnl-generic.rbuild URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ntoskrnl-generic.…
Modified: trunk/reactos/ntoskrnl/se/access.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/access.c?rev=3…
Modified: trunk/reactos/ntoskrnl/se/acl.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/acl.c?rev=3312…
Modified: trunk/reactos/ntoskrnl/se/audit.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/audit.c?rev=33…
Modified: trunk/reactos/ntoskrnl/se/lsa.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/lsa.c?rev=3312…
Removed: trunk/reactos/ntoskrnl/se/luid.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/luid.c?rev=331…
Modified: trunk/reactos/ntoskrnl/se/priv.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/priv.c?rev=331…
Modified: trunk/reactos/ntoskrnl/se/sd.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/sd.c?rev=33129…
Modified: trunk/reactos/ntoskrnl/se/semgr.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/semgr.c?rev=33…
Modified: trunk/reactos/ntoskrnl/se/sid.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/sid.c?rev=3312…
Modified: trunk/reactos/ntoskrnl/se/token.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/se/token.c?rev=33…
16 years, 8 months
1
0
0
0
[fireball] 33128: - Fix logic bugs in LpcRequestPort (which is not the same as NtRequestPort as someone incorrectly assumed previously) and also reference/dereference the process who owns the server mapping.
by fireball@svn.reactos.org
Author: fireball Date: Wed Apr 23 11:40:08 2008 New Revision: 33128 URL:
http://svn.reactos.org/svn/reactos?rev=33128&view=rev
Log: - Fix logic bugs in LpcRequestPort (which is not the same as NtRequestPort as someone incorrectly assumed previously) and also reference/dereference the process who owns the server mapping. Modified: trunk/reactos/ntoskrnl/lpc/close.c trunk/reactos/ntoskrnl/lpc/connect.c trunk/reactos/ntoskrnl/lpc/send.c Modified: trunk/reactos/ntoskrnl/lpc/close.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/lpc/close.c?rev=3…
============================================================================== --- trunk/reactos/ntoskrnl/lpc/close.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/lpc/close.c [iso-8859-1] Wed Apr 23 11:40:08 2008 @@ -374,7 +374,7 @@ } /* Dereference the mapping process */ - //ObDereferenceObject(Port->MappingProcess); + ObDereferenceObject(Port->MappingProcess); Port->MappingProcess = NULL; } Modified: trunk/reactos/ntoskrnl/lpc/connect.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/lpc/connect.c?rev…
============================================================================== --- trunk/reactos/ntoskrnl/lpc/connect.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/lpc/connect.c [iso-8859-1] Wed Apr 23 11:40:08 2008 @@ -299,7 +299,7 @@ /* Reference and remember the process */ ClientPort->MappingProcess = PsGetCurrentProcess(); - //ObReferenceObject(ClientPort->MappingProcess); + ObReferenceObject(ClientPort->MappingProcess); } else { Modified: trunk/reactos/ntoskrnl/lpc/send.c URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/lpc/send.c?rev=33…
============================================================================== --- trunk/reactos/ntoskrnl/lpc/send.c [iso-8859-1] (original) +++ trunk/reactos/ntoskrnl/lpc/send.c [iso-8859-1] Wed Apr 23 11:40:08 2008 @@ -198,28 +198,41 @@ if (Thread->LpcExitThreadCalled) return STATUS_THREAD_IS_TERMINATING; /* Check if this is an LPC Request */ - if (LpcpGetMessageType(LpcRequest) == LPC_REQUEST) - { - /* Then it's a callback */ - Callback = TRUE; - } - else - { - /* This is a kernel-mode message without a callback */ - LpcRequest->u2.s2.Type |= LPC_REQUEST; - Callback = FALSE; - } - - /* Get the message type */ - MessageType = LpcRequest->u2.s2.Type; - - /* Validate the length */ - if (((ULONG)LpcRequest->u1.s1.DataLength + sizeof(PORT_MESSAGE)) > - (ULONG)LpcRequest->u1.s1.TotalLength) - { - /* Fail */ - return STATUS_INVALID_PARAMETER; - } + MessageType = LpcpGetMessageType(LpcRequest); + switch (MessageType) + { + /* No type */ + case 0: + + /* Assume LPC request */ + MessageType = LPC_REQUEST; + break; + + /* LPC request callback */ + case LPC_REQUEST: + + /* This is a callback */ + Callback = TRUE; + break; + + /* Anything else */ + case LPC_CLIENT_DIED: + case LPC_PORT_CLOSED: + case LPC_EXCEPTION: + case LPC_DEBUG_EVENT: + case LPC_ERROR_EVENT: + + /* Nothing to do */ + break; + + default: + + /* Invalid message type */ + return STATUS_INVALID_PARAMETER; + } + + /* Set the request type */ + LpcRequest->u2.s2.Type = MessageType; /* Validate the message length */ if (((ULONG)LpcRequest->u1.s1.TotalLength > Port->MaxMessageLength) || @@ -250,7 +263,7 @@ LpcpMoveMessage(&Message->Request, LpcRequest, LpcRequest + 1, - MessageType, + 0, &Thread->Cid); /* Acquire the LPC lock */ @@ -383,19 +396,21 @@ (&Message->Request) + 1, 0, NULL); - - /* Check if this is an LPC request with data information */ - if ((LpcpGetMessageType(&Message->Request) == LPC_REQUEST) && - (Message->Request.u2.s2.DataInfoOffset)) - { - /* Save the data information */ - LpcpSaveDataInfoMessage(Port, Message, 0); - } - else - { - /* Otherwise, just free it */ - LpcpFreeToPortZone(Message, 0); - } + + /* Acquire the lock */ + KeAcquireGuardedMutex(&LpcpLock); + + /* Check if we replied to a thread */ + if (Message->RepliedToThread) + { + /* Dereference */ + ObDereferenceObject(Message->RepliedToThread); + Message->RepliedToThread = NULL; + } + + + /* Free the message */ + LpcpFreeToPortZone(Message, 3); } else { @@ -415,6 +430,7 @@ Port, Status); + /* Dereference the connection port */ if (ConnectionPort) ObDereferenceObject(ConnectionPort); return Status; }
16 years, 8 months
1
0
0
0
← Newer
1
...
4
5
6
7
8
9
10
...
40
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Results per page:
10
25
50
100
200