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 2005
----- 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
26 participants
477 discussions
Start a n
N
ew thread
[chorns] 14552: Copy makefile
by chorns@svn.reactos.com
Copy makefile Added: branches/xmlbuildsystem/reactos/lib/msgina/makefile _____ Copied: branches/xmlbuildsystem/reactos/lib/msgina/makefile (from rev 14550, trunk/reactos/lib/msgina/makefile)
19 years, 8 months
1
0
0
0
[chorns] 14551: Delete Makefile
by chorns@svn.reactos.com
Delete Makefile Deleted: branches/xmlbuildsystem/reactos/lib/msgina/Makefile _____ Deleted: branches/xmlbuildsystem/reactos/lib/msgina/Makefile --- branches/xmlbuildsystem/reactos/lib/msgina/Makefile 2005-04-08 17:24:30 UTC (rev 14550) +++ branches/xmlbuildsystem/reactos/lib/msgina/Makefile 2005-04-08 18:59:37 UTC (rev 14551) @@ -1,45 +0,0 @@ -# $Id$ - -PATH_TO_TOP = ../.. - -TARGET_TYPE = dynlink - -TARGET_NAME = msgina - -TARGET_INSTALLDIR = system32 - -TARGET_BASE = $(TARGET_BASE_LIB_MSGINA) - -TARGET_CFLAGS = \ - -I./include \ - -DUNICODE \ - -D_UNICODE \ - -D__REACTOS__ \ - -Wall \ - -Werror \ - -fno-builtin - -TARGET_LFLAGS = -nostartfiles -nostdlib - -TARGET_SDKLIBS = ntdll.a kernel32.a advapi32.a user32.a - -TARGET_GCCLIBS = gcc - -TARGET_PCH = - -TARGET_CLEAN = - -TARGET_OBJECTS = msgina.o stubs.o - -DEP_OBJECTS = $(TARGET_OBJECTS) - -include $(PATH_TO_TOP)/rules.mak - -include $(TOOLS_PATH)/helper.mk - -include $(TOOLS_PATH)/depend.mk - -%/TAGS: - etags -o $(@D)/TAGS $((a)D)/\*.c - -etags: ./TAGS
19 years, 8 months
1
0
0
0
[chorns] 14550: Build when DBG=1
by chorns@svn.reactos.com
Build when DBG=1 Modified: branches/xmlbuildsystem/reactos/lib/iphlpapi/ifenum_reactos.c Modified: branches/xmlbuildsystem/reactos/lib/iphlpapi/iphlpapi.xml Modified: branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml _____ Modified: branches/xmlbuildsystem/reactos/lib/iphlpapi/ifenum_reactos.c --- branches/xmlbuildsystem/reactos/lib/iphlpapi/ifenum_reactos.c 2005-04-08 16:59:16 UTC (rev 14549) +++ branches/xmlbuildsystem/reactos/lib/iphlpapi/ifenum_reactos.c 2005-04-08 17:24:30 UTC (rev 14550) @@ -424,7 +424,7 @@ } DPRINT("getNumInterfaces: success: %d %d %08x\n", - onlyLoopback, numInterfaces, status ); + onlyNonLoopback, numInterfaces, status ); tdiFreeThingSet( entitySet ); _____ Modified: branches/xmlbuildsystem/reactos/lib/iphlpapi/iphlpapi.xml --- branches/xmlbuildsystem/reactos/lib/iphlpapi/iphlpapi.xml 2005-04-08 16:59:16 UTC (rev 14549) +++ branches/xmlbuildsystem/reactos/lib/iphlpapi/iphlpapi.xml 2005-04-08 17:24:30 UTC (rev 14550) @@ -8,7 +8,6 @@ <define name="__REACTOS__" /> <define name="__USE_W32API" /> <library>wine</library> - <library>rtl</library> <library>ntdll</library> <library>kernel32</library> <library>advapi32</library> _____ Modified: branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml --- branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml 2005-04-08 16:59:16 UTC (rev 14549) +++ branches/xmlbuildsystem/reactos/ntoskrnl/ntoskrnl.xml 2005-04-08 17:24:30 UTC (rev 14550) @@ -14,6 +14,7 @@ <library>rosrtl</library> <library>rtl</library> <library>string</library> + <library>rossym</library> <directory name="include"> <pch>ntoskrnl.h</pch> </directory> @@ -102,11 +103,10 @@ <file>kdb_keyboard.c</file> <file>kdb_serial.c</file> <file>rdebug.c</file> - <file>profile.c</file> </if> <if property="DBG_OR_KDBG" value="true"> - <file>kdb_stabs.c</file> <file>kdb_symbols.c</file> + <file>profile.c</file> </if> <file>dbgctrl.c</file> <file>errinfo.c</file>
19 years, 8 months
1
0
0
0
[greatlrd] 14549: New document icon from Mindflyer <mf@mufunyo.net>
by greatlrd@svn.reactos.com
New document icon from Mindflyer <mf(a)mufunyo.net> Modified: trunk/reactos/lib/shell32/shres.rc _____ Modified: trunk/reactos/lib/shell32/shres.rc --- trunk/reactos/lib/shell32/shres.rc 2005-04-08 16:58:29 UTC (rev 14548) +++ trunk/reactos/lib/shell32/shres.rc 2005-04-08 16:59:16 UTC (rev 14549) @@ -38,23 +38,266 @@ /* BINRES document.ico */ 1 ICON document.ico /* { - '00 00 01 00 08 00 20 20 00 00 01 00 08 00 A8 08' - '00 00 86 00 00 00 10 10 00 00 01 00 08 00 68 05' - '00 00 2E 09 00 00 20 20 00 00 01 00 04 00 E8 02' - '00 00 96 0E 00 00 10 10 00 00 01 00 04 00 28 01' - '00 00 7E 11 00 00 30 30 00 00 01 00 08 00 A8 0E' - '00 00 A6 12 00 00 30 30 00 00 01 00 20 00 A8 25' - '00 00 4E 21 00 00 20 20 00 00 01 00 20 00 A8 10' - '00 00 F6 46 00 00 10 10 00 00 01 00 20 00 68 04' - '00 00 9E 57 00 00 28 00 00 00 20 00 00 00 40 00' + '00 00 01 00 0C 00 10 10 10 00 01 00 04 00 28 01' + '00 00 C6 00 00 00 10 10 00 00 01 00 08 00 68 05' + '00 00 EE 01 00 00 10 10 00 00 01 00 20 00 68 04' + '00 00 56 07 00 00 20 20 10 00 01 00 04 00 E8 02' + '00 00 BE 0B 00 00 20 20 00 00 01 00 08 00 A8 08' + '00 00 A6 0E 00 00 20 20 00 00 01 00 20 00 A8 10' + '00 00 4E 17 00 00 30 30 10 00 01 00 04 00 68 06' + '00 00 F6 27 00 00 30 30 00 00 01 00 08 00 A8 0E' + '00 00 5E 2E 00 00 30 30 00 00 01 00 20 00 A8 25' + '00 00 06 3D 00 00 40 40 10 00 01 00 04 00 68 0A' + '00 00 AE 62 00 00 40 40 00 00 01 00 08 00 28 16' + '00 00 16 6D 00 00 40 40 00 00 01 00 20 00 28 42' + '00 00 3E 83 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 04 00 00 00 00 00 80 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 80 80 80 00 C0 C0' + 'C0 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 88' + '88 88 88 88 88 00 00 8F FF FF FF FF F8 00 00 8F' + 'FF FF FF FF F8 00 00 8F FF FF FF FF F8 00 00 8F' + 'FF FF FF FF F8 00 00 8F FF FF FF FF F8 00 00 8F' + 'FF FF FF FF F8 00 00 8F FF FF FF FF F8 00 00 8F' + 'FF FF FF FF F8 00 00 8F FF FF FF FF F8 00 00 8F' + 'FF FF FF F8 88 00 00 8F FF FF F8 77 80 00 00 8F' + 'FF FF F8 F8 80 00 00 8F FF FF F8 F8 00 00 00 8F' + 'FF FF F8 80 00 00 00 88 88 88 88 00 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 07 00 00 C0 07' + '00 00 C0 0F 00 00 C0 1F 00 00 C0 3F 00 00 28 00' + '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' + '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01' + '00 00 00 01 00 00 00 00 00 00 00 00 80 00 00 80' + '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' + '00 00 C0 C0 C0 00 C0 DC C0 00 F0 CA A6 00 FF 00' + 'FF 00 8C 8C 8C 00 A5 A5 A5 00 A9 A9 A9 00 B5 B5' + 'B5 00 BA BA BA 00 C0 C0 C0 00 C2 C2 C2 00 C6 C6' + 'C6 00 C9 C9 C9 00 CA CA CA 00 CB CB CB 00 CC CC' + 'CC 00 CD CD CD 00 CE CE CE 00 CF CF CF 00 D0 D0' + 'D0 00 D1 D1 D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4' + 'D4 00 D5 D5 D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8' + 'D8 00 D9 D9 D9 00 DA DA DA 00 DE DE DE 00 E0 E0' + 'E0 00 E1 E1 E1 00 E2 E2 E2 00 E3 E3 E3 00 E5 E5' + 'E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 EE EE EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1' + 'F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5' + 'F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9' + 'F9 00 FA FA FA 00 FB FB FB 00 FC FC FC 00 FD FD' + 'FD 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 FB' + 'FF 00 A4 A0 A0 00 80 80 80 00 00 00 FF 00 00 FF' + '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' + '00 00 FF FF FF 00 00 00 21 21 20 1F 1F 1D 1C 1B' + '19 17 16 1F 00 00 00 00 21 35 34 32 31 30 2E 2B' + '29 26 25 17 00 00 00 00 22 36 34 33 32 31 2F 2D' + '2A 29 27 18 00 00 00 00 23 37 34 34 33 32 31 2F' + '2E 2A 29 19 00 00 00 00 23 38 36 35 34 33 32 31' + '2F 2E 2C 1C 00 00 00 00 23 39 36 36 35 34 33 32' + '31 2F 2F 1D 00 00 00 00 23 39 38 37 36 35 34 33' + '32 31 31 1E 00 00 00 00 23 3B 38 38 37 36 35 34' + '33 32 32 1F 00 00 00 00 23 3C 3A 39 38 37 36 35' + '34 33 30 13 00 00 00 00 23 3C 3B 3A 39 38 37 36' + '35 35 13 1E 00 00 00 00 23 3D 3C 3B 3A 39 38 38' + '38 1B 0D 1B 00 00 00 00 23 3F 3D 3C 3B 3A 36 12' + '0B 0C 0F 00 00 00 00 00 23 40 3E 3D 3C 3C 1A 1A' + '2B 07 18 00 00 00 00 00 23 41 40 3E 3D 3C 28 15' + '14 18 00 00 00 00 00 00 24 42 41 40 3E 3D 29 0E' + '11 00 00 00 00 00 00 00 1F 21 20 20 20 1E 21 17' + '00 00 00 00 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 07 00 00 C0 07 00 00 C0 0F 00 00 C0 1F' + '00 00 C0 3F 00 00 28 00 00 00 10 00 00 00 20 00' + '00 00 01 00 20 00 00 00 00 00 40 04 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 A1 A1 A1 6C BF BF BF 9F BE BE' + 'BE A0 BC BC BC A0 BC BC BC A0 B9 B9 B9 A0 B7 B7' + 'B7 A0 B5 B5 B5 A0 B3 B3 B3 A0 B0 B0 B0 A0 AE AE' + 'AE 9F 94 94 94 64 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C4 C4 C4 AD F0 F0 F0 FF EF EF' + 'EF FF ED ED ED FF EC EC EC FF EB EB EB FF E9 E9' + 'E9 FF E6 E6 E6 FF E3 E3 E3 FF E0 E0 E0 FF DE DE' + 'DE FE AE AE AE 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C6 C6 C6 AD F1 F1 F1 FF EF EF' + 'EF FF EE EE EE FF ED ED ED FF EC EC EC FF EA EA' + 'EA FF E8 E8 E8 FF E5 E5 E5 FF E3 E3 E3 FF E1 E1' + 'E1 FE B0 B0 B0 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F2 F2 F2 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EA EA EA FF E9 E9 E9 FF E5 E5 E5 FF E3 E3' + 'E3 FE B2 B2 B2 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F3 F3 F3 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF EC EC EC FF EA EA EA FF E9 E9 E9 FF E7 E7' + 'E7 FE B6 B6 B6 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F4 F4 F4 FF F1 F1' + 'F1 FF F1 F1 F1 FF F0 F0 F0 FF EF EF EF FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EA EA EA FF EA EA' + 'EA FE B8 B8 B8 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F4 F4 F4 FF F3 F3' + 'F3 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF' + 'EF FF EE EE EE FF ED ED ED FF EC EC EC FF EC EC' + 'EC FE B9 B9 B9 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F6 F6 F6 FF F3 F3' + 'F3 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EE EE EE FF ED ED ED FF ED ED' + 'ED FE BB BB BB 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F7 F7 F7 FF F5 F5' + 'F5 FF F4 F4 F4 FF F3 F3 F3 FF F2 F2 F2 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF EE EE EE FF EB EB' + 'EB FE A8 A8 A8 9E 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F7 F7 F7 FF F6 F6' + 'F6 FF F5 F5 F5 FF F4 F4 F4 FF F3 F3 F3 FF F2 F2' + 'F2 FF F1 F1 F1 FF F0 F0 F0 FF F0 F0 F0 FF C9 C9' + 'C9 FE B2 B2 B2 8F 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD F8 F8 F8 FF F7 F7' + 'F7 FF F6 F6 F6 FF F5 F5 F5 FF F4 F4 F4 FF F3 F3' + 'F3 FF F3 F3 F3 FF F3 F3 F3 FF D1 D1 D1 FE A7 A7' + 'A7 F9 87 87 87 62 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD FA FA FA FF F8 F8' + 'F8 FF F7 F7 F7 FF F6 F6 F6 FF F5 F5 F5 FF F1 F1' + 'F1 FF C6 C6 C6 FF 8C 8C 8C FF A4 A4 A4 FD 9A 9A' + '9A AD 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD FB FB FB FF F9 F9' + 'F9 FF F8 F8 F8 FF F7 F7 F7 FF F7 F7 F7 FF D0 D0' + 'D0 FF D0 D0 D0 FF E6 E6 E6 FE B3 B3 B3 D5 37 37' + '37 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C7 C7 C7 AD FC FC FC FF FB FB' + 'FB FF F9 F9 F9 FF F8 F8 F8 FF F7 F7 F7 FF E2 E2' + 'E2 FF CB CB CB FE C6 C6 C6 ED 5C 5C 5C 4D 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 C9 C9 C9 AD FD FD FD FF FC FC' + 'FC FF FB FB FB FF F9 F9 F9 FF F8 F8 F8 FF E3 E3' + 'E3 FF B3 B3 B3 F8 89 89 89 83 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 A6 A6 A6 77 C5 C5 C5 AF C3 C3' + 'C3 B0 C3 C3 C3 B0 C3 C3 C3 B0 C1 C1 C1 B0 C2 C2' + 'C2 A6 9D 9D 9D 81 0F 0F 0F 10 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 03 00 00 C0 03' + '00 00 C0 03 00 00 C0 03 00 00 C0 07 00 00 C0 07' + '00 00 C0 0F 00 00 C0 1F 00 00 C0 1F 00 00 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 04 00 00 00' + '00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80' + '00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80' + '00 00 80 80 80 00 C0 C0 C0 00 00 00 FF 00 00 FF' + '00 00 00 FF FF 00 FF 00 00 00 FF 00 FF 00 FF FF' + '00 00 FF FF FF 00 00 00 00 88 88 88 88 88 88 88' + '88 88 88 88 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF F8 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF 88 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF 88 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF FF 88 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF F8 88 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF FF F8 78 00 00 00 00 00 8F FF FF FF FF FF FF' + 'FF 88 87 80 00 00 00 00 00 8F FF FF FF FF FF FF' + '87 87 88 00 00 00 00 00 00 8F FF FF FF FF FF FF' + '7F 8F 88 00 00 00 00 00 00 8F FF FF FF FF FF FF' + '88 F8 80 00 00 00 00 00 00 8F FF FF FF FF FF FF' + 'F7 F7 00 00 00 00 00 00 00 8F FF FF FF FF FF FF' + '88 88 00 00 00 00 00 00 00 88 88 88 88 88 88 88' + '88 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 1F FC 00 00 3F FC 00' + '00 3F FC 00 00 7F FC 00 00 FF FC 00 00 FF FC 00' + '01 FF FF FF FF FF 28 00 00 00 20 00 00 00 40 00' '00 00 01 00 08 00 00 00 00 00 00 04 00 00 00 00' + '00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 00' + '00 00 00 00 80 00 00 80 00 00 00 80 80 00 80 00' + '00 00 80 00 80 00 80 80 00 00 C0 C0 C0 00 C0 DC' + 'C0 00 F0 CA A6 00 77 77 77 00 FF 00 FF 00 82 82' + '82 00 A0 A0 A0 00 A1 A1 A1 00 A3 A3 A3 00 A7 A7' + 'A7 00 A9 A9 A9 00 AE AE AE 00 B2 B2 B2 00 B3 B3' + 'B3 00 B4 B4 B4 00 B5 B5 B5 00 B8 B8 B8 00 BA BA' + 'BA 00 BB BB BB 00 BC BC BC 00 BD BD BD 00 BE BE' + 'BE 00 BF BF BF 00 C0 C0 C0 00 C5 C5 C5 00 C6 C6' + 'C6 00 C7 C7 C7 00 C8 C8 C8 00 C9 C9 C9 00 CB CB' + 'CB 00 CD CD CD 00 CF CF CF 00 D0 D0 D0 00 D1 D1' + 'D1 00 D2 D2 D2 00 D3 D3 D3 00 D4 D4 D4 00 D5 D5' + 'D5 00 D6 D6 D6 00 D7 D7 D7 00 D8 D8 D8 00 D9 D9' + 'D9 00 DA DA DA 00 DB DB DB 00 DC DC DC 00 DD DD' + 'DD 00 DE DE DE 00 DF DF DF 00 E0 E0 E0 00 E1 E1' + 'E1 00 E2 E2 E2 00 E3 E3 E3 00 E4 E4 E4 00 E5 E5' + 'E5 00 E6 E6 E6 00 E7 E7 E7 00 E8 E8 E8 00 E9 E9' + 'E9 00 EA EA EA 00 EB EB EB 00 EC EC EC 00 ED ED' + 'ED 00 EE EE EE 00 EF EF EF 00 F0 F0 F0 00 F1 F1' + 'F1 00 F2 F2 F2 00 F3 F3 F3 00 F4 F4 F4 00 F5 F5' + 'F5 00 F6 F6 F6 00 F7 F7 F7 00 F8 F8 F8 00 F9 F9' + 'F9 00 FA FA FA 00 FB FB FB 00 FC FC FC 00 FD FD' + 'FD 00 FE FE FE 00 FF FF FF 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 11 11 00 22 22 22 00 33 33 33 00 55 55' - '55 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 88 88' - '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC CC' - 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' - '00 00 33 00 32 00 5C 00 64 00 6F 00 63 00 75 00' - '6D 00 65 00 6E 00 74 00 2E 00 69 00 63 00 6F 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -69,131 +312,10 @@ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 5A 00 5C 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5A 00' - '00 00 00 00 00 00 03 00 00 00 62 00 1A 02 40 9F' - '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' - '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' - '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' - '68 65 6C 6C 33 32 5C 64 6F 63 75 6D 65 6E 74 2E' - '69 63 6F 00 4B 00 14 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00' - '10 01 08 09 09 09 09 09 09 08 09 09 08 09 09 08' - '06 03 10 10 10 00 00 00 00 00 00 00 00 00 00 00' - '10 02 0C 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F' - '0B 08 03 10 10 10 00 00 00 00 00 00 00 00 00 00' - '10 01 0C 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0A 0C 0A 02 10 10 10 00 00 00 00 00 00 00 00 00' - '10 02 0B 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D 0E' - '0A 0D 0D 0A 02 10 10 10 00 00 00 00 00 00 00 00' - '10 01 0C 0E 0D 0D 0D 0D 0D 0D 0E 0D 0D 0E 0D 0D' - '0B 0D 0E 0E 0A 03 10 10 10 00 00 00 00 00 00 00' - '10 02 0C 0E 0D 0D 0D 0E 0D 0D 0D 0D 0E 0D 0E 0D' - '0A 0D 0F 0E 0E 09 02 10 10 00 00 00 00 00 00 00' - '10 01 0C 0E 0D 0E 0D 0D 0D 0E 0D 0E 0D 0D 0E 0D' - '0B 0D 0E 0F 0E 0F 0A 02 10 10 00 00 00 00 00 00' - '10 02 0C 0E 0D 0D 0E 0D 0E 0D 0D 0E 0E 0D 0D 0E' - '0A 0E 0F 0E 0F 0F 0F 0A 02 10 10 10 00 00 00 00' - '10 01 0C 0E 0D 0E 0E 0D 0D 0E 0E 0D 0D 0E 0E 0E' - '0A 0D 0E 0E 0E 0E 0E 0E 09 03 10 10 00 00 00 00' - '10 02 0C 0E 0E 0D 0D 0E 0E 0D 0E 0E 0E 0D 0E 0E' - '0C 0A 0B 0B 0B 0A 0B 0B 0B 06 10 10 00 00 00 00' - '10 01 0C 0F 0D 0E 0E 0D 0E 0E 0D 0E 0D 0E 0D 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0F 09 10 10 00 00 00 00' - '10 02 0C 0E 0E 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0E 08 10 10 00 00 00 00' - '10 01 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0F 0E 0E 0E 0E 0E 0F 0E 09 10 10 00 00 00 00' - '10 01 0C 0F 0E 0E 0E 0E 0F 0E 0F 0E 0E 0E 0F 0E' - '0E 0E 0E 0E 0F 0E 0F 0E 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0E 0F 0E 0F 0E 0F 0E 0F 0F 0F 0E 0F' - '0F 0E 0F 0E 0E 0E 0E 0F 0F 08 10 10 00 00 00 00' - '10 02 0C 0F 0E 0E 0F 0E 0F 0E 0F 0F 0F 0E 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0E 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0F 0E 0E 0F 0E 0F 0E 0F 0E 0F 0F 0E' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0E 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0F 0E 0F 0F 0E 0F 0F 0E 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0F 0F 0E 0F 0F 0E 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0D 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 01 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0A 10 10 00 00 00 00' - '10 02 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 09 10 10 00 00 00 00' - '10 02 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0A 10 10 00 00 00 00' - '10 01 06 08 06 06 06 06 06 06 06 06 06 06 06 06' - '06 06 05 06 05 06 05 05 06 04 10 10 00 00 00 00' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 00 00 E0 00' - '07 FF C0 00 03 FF C0 00 01 FF C0 00 00 FF C0 00' - '00 7F C0 00 00 3F C0 00 00 1F C0 00 00 1F C0 00' - '00 0F C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 08 00 00 00' - '00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 11 11 11 00 33 33' - '33 00 44 44 44 00 77 77 77 00 7F 7F 7F 00 99 99' - '99 00 AA AA AA 00 BB BB BB 00 CC CC CC 00 DD DD' - 'DD 00 EE EE EE 00 FF FF FF 00 00 00 00 00 EE EE' - 'EE 00 FF FF FF 00 00 00 00 00 33 00 32 00 5C 00' - '64 00 6F 00 63 00 75 00 6D 00 65 00 6E 00 74 00' - '2E 00 69 00 63 00 6F 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' @@ -207,1310 +329,2874 @@ '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 C0 17' - '95 00 00 00 38 00 A8 44 F9 77 13 00 00 00 18 0A' - '38 00 00 00 38 00 18 6C 38 00 98 17 95 00 00 00' - '00 00 E0 19 95 00 F0 88 FA 77 70 38 F5 77 FF FF' - 'FF FF A8 44 F9 77 70 7D F5 77 3A 8A F5 77 86 00' - '00 00 86 00 00 00 08 00 00 00 B0 18 95 00 00 00' - '00 00 CB 44 F9 77 38 9F 07 00 CD 8B F5 77 78 13' - '05 00 37 90 F5 77 00 00 00 00 3E 8A F5 77 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 10 00 00 00 00 00 00 00 5A 00' - '5C 00 00 EC FD 7F 1A 02 00 00 4C 16 95 00 40 9F' - '07 00 FC 15 95 00 FF FF FF FF B4 1A 95 00 45 00' - '00 00 28 02 00 00 FF FF FF FF E2 D8 F5 77 7D 9B' - 'F5 77 94 B6 01 00 00 00 05 00 F4 17 95 00 80 00' - '10 C0 B4 1A 95 00 F0 88 FA 77 88 1C F5 77 FF FF' - 'FF FF 37 90 F5 77 00 00 00 00 3E 8A F5 77 9B B2' - 'E7 77 B7 00 00 00 02 00 00 00 A4 1A 95 00 01 00' - '00 00 18 00 00 00 00 00 00 00 10 19 95 00 42 00' - '00 00 00 00 00 00 F4 18 95 00 00 00 00 00 00 00' - '00 00 00 00 00 00 0C 00 00 00 02 00 00 00 01 01' - 'F5 77 00 EC FD 7F 5A 00 00 00 00 00 00 00 03 00' - '00 00 62 00 1A 02 40 9F 07 00 00 00 00 00 40 9F' - '07 00 05 00 00 00 BE B3 E7 77 4C 19 95 00 A3 B4' - 'E7 77 F8 00 00 00 00 00 00 C0 00 00 00 00 00 00' - '00 00 02 00 00 00 80 00 00 00 00 00 00 00 8C 1A' - '95 00 7F E9 4B 00 08 6C 0C 01 00 00 00 C0 00 00' - '00 00 80 1A 95 00 02 00 00 00 80 00 00 00 00 00' - '00 00 C0 27 95 00 C4 F5 AF 00 02 00 00 00 44 3A' - '5C 6F 73 65 78 70 65 72 74 73 5C 72 65 61 63 74' - '6F 73 5C 6C 69 62 5C 73 68 65 6C 6C 33 32 5C 64' - '6F 63 75 6D 65 6E 74 2E 69 63 6F 00 4B 00 14 1A' - '95 00 1F 3B D4 77 13 00 00 00 98 00 00 00 4F 3B' - 'D4 77 E0 19 95 00 33 3B D4 77 64 C5 F5 77 A9 F1' - 'E7 77 F8 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 1A 95 00 18 6C 38 00 86 00 00 00 00 00' - '00 00 C9 F1 E7 77 86 00 00 00 A4 1A 95 00 08 00' - '00 00 00 00 00 00 86 00 00 00 86 00 00 00 08 00' - '00 00 F4 19 95 00 33 3B D4 77 B4 1A 95 00 09 48' - 'E9 77 B8 10 E9 77 FF FF FF FF C9 F1 E7 77 16 EA' - '4B 00 F8 00 00 00 18 6C 38 00 86 00 00 00 58 1A' - '95 00 00 00 00 00 00 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0D 00 00 00 00 00 00 01 07 08 08 07 08 07 08 04' - '0D 0D 00 00 00 00 00 01 09 0B 0A 0B 0B 0B 0A 09' - '06 0D 0D 00 00 00 00 01 0A 0A 0A 0A 0A 0B 0A 09' - '0C 06 0D 0D 00 00 00 01 09 0A 0B 0A 0B 0A 0A 09' - '0C 0C 06 01 0D 00 00 01 0A 0B 0A 0B 0A 0B 0A 09' - '0A 09 0A 04 0D 00 00 01 09 0B 0B 0A 0B 0B 0B 0B' - '0A 0B 0B 08 0D 00 00 01 0A 0C 0B 0B 0B 0B 0B 0B' - '0B 0B 0C 08 0D 00 00 01 0A 0B 0B 0C 0B 0C 0B 0B' - '0C 0B 0C 09 0D 00 00 01 0B 0C 0B 0C 0B 0C 0C 0C' - '0C 0C 0C 08 0D 00 00 01 09 0C 0C 0B 0C 0C 0C 0C' - '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' - '0C 0C 0C 08 0D 00 00 01 0A 0C 0C 0C 0C 0C 0C 0C' - '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' - '0C 0C 0C 09 0D 00 00 01 0B 0C 0C 0C 0C 0C 0C 0C' - '0C 0C 0C 09 0D 00 00 0D 03 03 03 03 03 03 03 02' - '03 02 03 02 0D 00 80 1F 00 00 80 0F 00 00 80 07' - '00 00 80 03 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 28 00 00 00 20 00 00 00 40 00' - '00 00 01 00 04 00 00 00 00 00 00 02 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 80 00 00 00 00 80 00 00 80 80 00 00 00 00' - '80 00 80 00 80 00 00 80 80 00 C0 C0 C0 00 80 80' - '80 00 FF 00 00 00 00 FF 00 00 FF FF 00 00 00 00' - 'FF 00 FF 00 FF 00 00 FF FF 00 FF FF FF 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08' - '88 87 88 78 88 78 88 88 00 00 00 00 00 00 00 00' - '7F F7 FF 7F FF 7F F7 78 80 00 00 00 00 00 00 04' - '7F 7F 77 F7 F7 F7 FF 8F 88 00 00 00 00 00 00 00' - '7F F7 FF 7F 7F 7F 7F 77 F8 80 00 00 00 00 00 08' - '7F 77 F7 F7 F7 F7 F7 77 FF 88 00 00 00 00 00 00' - '7F F7 7F 7F 7F 7F 7F 7F 7F F8 80 00 00 00 00 08' - '7F 7F F7 F7 F7 F7 F7 77 FF FF 88 00 00 00 00 00' - '7F F7 FF 7F 7F F7 FF 8F FF FF F8 80 00 00 00 08' - '7F 7F 77 F7 FF 7F F7 77 F7 F7 FF 84 00 00 00 00' - '7F F7 FF 7F 7F F7 FF 77 77 77 87 78 00 00 00 08' - '7F 7F F7 FF F7 FF 7F FF 7F F7 FF F7 00 00 00 00' - '7F F7 FF 7F 7F 7F F7 FF F7 FF F7 F8 00 00 00 08' - '7F FF F7 F7 FF F7 FF 7F 7F FF 7F F8 00 00 00 00' - '7F 7F FF FF 7F FF 7F FF F7 FF FF F8 00 00 00 04' - '7F FF 7F F7 FF 7F FF F7 FF FF F7 F7 00 00 00 00' - 'FF FF FF FF FF F7 FF FF 7F F7 FF F8 00 00 00 08' - '7F 7F F7 FF FF FF FF FF FF FF FF F8 00 00 00 00' - '7F FF FF F7 FF FF FF FF FF FF FF F8 00 00 00 08' - '7F FF FF FF FF 7F FF FF FF FF FF F7 00 00 00 00' - 'FF F7 FF FF FF FF FF FF FF FF FF F8 00 00 00 08' - '7F FF FF 7F FF FF FF FF FF FF FF F7 00 00 00 00' - '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 08' - '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' - 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 08' - '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 00' - 'FF FF FF FF FF FF FF FF FF FF FF F7 00 00 00 04' - '7F FF FF FF FF FF FF FF FF FF FF F8 00 00 00 08' - '7F FF FF FF FF FF FF F7 FF FF FF F7 00 00 00 00' - '88 88 88 88 88 88 88 88 88 88 88 88 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 E0 00' - '07 FF C0 00 03 FF C0 00 01 FF C0 00 00 FF C0 00' - '00 7F C0 00 00 3F C0 00 00 1F C0 00 00 1F C0 00' - '00 0F C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 C0 00' - '00 03 C0 00 00 03 C0 00 00 03 C0 00 00 03 28 00' - '00 00 10 00 00 00 20 00 00 00 01 00 04 00 00 00' - '00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 80 00 00 00 00 80' - '00 00 80 80 00 00 00 00 80 00 80 00 80 00 00 80' - '80 00 C0 C0 C0 00 80 80 80 00 FF 00 00 00 00 FF' - '00 00 FF FF 00 00 00 00 FF 00 FF 00 FF 00 00 FF' - 'FF 00 FF FF FF 00 00 00 00 00 00 00 00 00 00 77' - '77 77 78 00 00 00 00 7F F7 FF 7F 80 00 00 04 7F' - '7F 7F 77 F8 00 00 00 77 F7 F7 F7 FF 70 00 00 FF' - '7F 7F 7F 7F 78 00 08 77 FF 7F F7 F7 F7 00 00 FF' - '7F FF 7F 7F F7 00 00 7F FF F7 FF FF F7 00 04 7F' - 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 00 7F' - 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 04 7F' - 'FF FF FF FF F7 00 00 FF FF FF FF FF F7 00 00 88' - '88 88 88 88 88 00 80 1F 00 00 80 0F 00 00 80 07' - '00 00 80 03 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 80 01 00 00 80 01 00 00 80 01' - '00 00 80 01 00 00 28 00 00 00 30 00 00 00 60 00' - '00 00 01 00 08 00 00 00 00 00 00 09 00 00 00 00' + '00 00 00 00 00 00 F0 FB FF 00 A4 A0 A0 00 80 80' + '80 00 00 00 FF 00 00 FF 00 00 00 FF FF 00 FF 00' + '00 00 FF 00 FF 00 FF FF 00 00 FF FF FF 00 00 00' + '00 00 00 00 22 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B 1B' + '1B 1B 1B 1B 1B 1B 1B 1B 20 21 00 00 00 00 00 00' + '00 00 00 00 26 35 35 35 35 35 35 35 35 35 35 33' + '32 31 30 2D 2C 2B 2A 28 29 1F 00 00 00 00 00 00' + '00 00 00 00 34 43 42 42 41 40 3F 3F 3D 3D 3B 39' + '38 36 35 33 30 2F 2E 2C 2A 1A 00 00 00 00 00 00' + '00 00 00 00 34 44 43 42 42 41 40 3F 3F 3D 3C 3A' + '39 38 36 35 32 30 2F 2E 2A 1A 00 00 00 00 00 00' + '00 00 00 00 35 44 44 43 42 42 41 40 3F 3F 3E 3C' + '3B 39 38 36 35 32 30 2F 2B 1A 00 00 00 00 00 00' + '00 00 00 00 35 45 44 44 43 42 42 41 40 3F 3F 3E' + '3C 3B 39 38 36 35 32 30 2D 1A 00 00 00 00 00 00' + '00 00 00 00 35 46 45 44 44 43 42 42 41 40 3F 3F' + '3E 3C 3B 39 38 36 35 33 2F 1A 00 00 00 00 00 00' + '00 00 00 00 36 46 46 45 44 44 43 42 42 41 40 3F' + '3F 3E 3C 3B 39 38 36 35 30 1A 00 00 00 00 00 00' + '00 00 00 00 37 47 46 46 45 44 43 43 42 42 41 40' + '3F 3E 3E 3C 3B 39 38 36 30 1A 00 00 00 00 00 00' + '00 00 00 00 37 48 47 46 46 45 44 43 43 42 42 41' + '40 3F 3E 3E 3C 3B 39 38 33 1B 00 00 00 00 00 00' + '00 00 00 00 37 49 48 47 46 46 45 44 43 43 42 42' + '41 40 3F 3E 3E 3C 3B 39 34 1A 00 00 00 00 00 00' + '00 00 00 00 37 49 49 48 47 46 46 45 44 43 43 42' + '42 41 40 3F 3E 3E 3C 3A 36 1B 00 00 00 00 00 00' + '00 00 00 00 37 4A 49 49 48 47 46 46 45 44 43 43' + '42 42 41 40 3F 3E 3D 3C 36 1B 00 00 00 00 00 00' + '00 00 00 00 38 4C 4A 49 49 48 47 46 46 45 44 43' + '43 42 42 41 40 3F 3E 3D 36 1B 00 00 00 00 00 00' + '00 00 00 00 38 4C 4C 4A 49 49 48 47 46 46 45 44' + '43 43 42 42 41 40 3F 3E 36 1B 00 00 00 00 00 00' + '00 00 00 00 38 4D 4C 4C 4A 49 49 48 47 46 46 45' + '44 43 43 42 42 41 40 3F 36 1B 00 00 00 00 00 00' + '00 00 00 00 39 4E 4D 4C 4C 4A 49 49 48 47 46 46' + '45 44 43 43 42 42 41 40 36 1B 00 00 00 00 00 00' + '00 00 00 00 39 4E 4E 4D 4C 4C 4A 49 49 48 47 46' + '46 45 44 43 43 42 42 41 36 1B 00 00 00 00 00 00' + '00 00 00 00 38 4F 4E 4E 4D 4C 4C 4A 49 49 48 47' + '46 46 45 44 43 43 42 42 36 1B 00 00 00 00 00 00' + '00 00 00 00 39 51 4F 4E 4E 4D 4C 4C 4A 49 49 48' + '47 46 46 45 44 43 43 42 36 1B 00 00 00 00 00 00' + '00 00 00 00 39 51 51 4F 4E 4E 4D 4C 4C 4A 49 49' + '48 47 46 46 45 44 43 43 35 1B 00 00 00 00 00 00' + '00 00 00 00 3A 52 52 51 4F 4E 4E 4D 4C 4C 4A 49' + '49 48 47 46 46 45 44 41 28 19 00 00 00 00 00 00' + '00 00 00 00 3A 54 53 52 51 4F 4E 4E 4D 4C 4B 4A' + '49 49 48 47 46 46 47 31 16 1C 00 00 00 00 00 00' + '00 00 00 00 3A 54 54 52 52 51 4F 4E 4E 4D 4C 4B' + '4A 49 49 48 47 47 45 14 17 07 00 00 00 00 00 00' + '00 00 00 00 3A 56 55 54 53 52 51 4F 4E 4E 4D 4C' + '4B 4A 4A 4A 4A 3F 11 0D 17 00 00 00 00 00 00 00' + '00 00 00 00 3A 56 55 54 54 52 51 51 4F 4E 4E 4D' + '4C 4B 4B 42 16 0A 0E 15 00 00 00 00 00 00 00 00' + '00 00 00 00 3A 56 56 56 55 54 53 51 51 4F 4E 4E' + '4D 4E 27 0C 10 31 07 18 00 00 00 00 00 00 00 00' + '00 00 00 00 3A 56 56 56 55 54 54 53 51 51 4F 4E' + '4E 4E 29 23 3B 24 16 00 00 00 00 00 00 00 00 00' + '00 00 00 00 3A 56 56 56 56 56 54 54 53 51 51 4F' + '4E 4F 3C 12 26 13 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 3A 56 56 56 56 56 55 54 54 53 51 50' + '4F 50 3F 0F 1B 07 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 3D 39 39 39 39 39 39 39 39 39 39 39' + '38 33 25 1A 1D 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 11 11 11 00 22 22 22 00 33 33 33 00 44 44' - '44 00 66 66 66 00 77 77 77 00 7F 7F 7F 00 88 88' - '88 00 99 99 99 00 AA AA AA 00 BB BB BB 00 CC CC' - 'CC 00 DD DD DD 00 EE EE EE 00 FF FF FF 00 00 00' - '00 00 33 00 32 00 5C 00 64 00 6F 00 63 00 75 00' - '6D 00 65 00 6E 00 74 00 2E 00 69 00 63 00 6F 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 0F FC 00 00 0F FC 00 00 0F FC 00 00 0F FC 00' + '00 1F FC 00 00 3F FC 00 00 3F FC 00 00 7F FC 00' + '00 FF FC 00 00 FF FC 00 01 FF FF FF FF FF 28 00' + '00 00 20 00 00 00 40 00 00 00 01 00 20 00 00 00' + '00 00 80 10 00 00 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 00 00 00 00 2C 2C' + '2C 43 26 26 26 4D 26 26 26 4D 26 26 26 4D 26 26' + '26 4D 26 26 26 4D 26 26 26 4D 26 26 26 4D 26 26' + '26 4D 26 26 26 4D 26 26 26 4D 26 26 26 4D 26 26' + '26 4D 26 26 26 4D 26 26 26 4D 23 23 23 4D 26 26' + '26 4D 23 23 23 4D 23 23 23 4D 23 23 23 4D 23 23' + '23 42 00 00 00 38 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 1F C2 C2' + 'C2 C9 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8' + 'D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D8' + 'D8 D8 D8 D8 D8 D8 D8 D8 D8 D8 D6 D6 D6 D8 D4 D4' + 'D4 D8 D3 D3 D3 D8 D2 D2 D2 D8 CF CF CF D8 CE CE' + 'CE D8 CC CC CC D8 CB CB CB D8 C9 C9 C9 D8 BF BF' + 'BF B4 20 20 20 42 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DA DA' + 'DA ED EC EC EC FF EB EB EB FF EB EB EB FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E8 E8 E8 FF E6 E6' + 'E6 FF E6 E6 E6 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1' + 'E1 FF DF DF DF FF DE DE DE FF DC DC DC FF D9 D9' + 'D9 FF D8 D8 D8 FF D7 D7 D7 FF D5 D5 D5 FF CB CB' + 'CB DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DA DA' + 'DA ED ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF E9 E9 E9 FF E8 E8 E8 FF E8 E8' + 'E8 FF E6 E6 E6 FF E5 E5 E5 FF E3 E3 E3 FF E2 E2' + 'E2 FF E1 E1 E1 FF DF DF DF FF DE DE DE FF DB DB' + 'DB FF D9 D9 D9 FF D8 D8 D8 FF D7 D7 D7 FF CB CB' + 'CB DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DB DB' + 'DB ED ED ED ED FF ED ED ED FF EC EC EC FF EB EB' + 'EB FF EB EB EB FF EA EA EA FF E9 E9 E9 FF E8 E8' + 'E8 FF E8 E8 E8 FF E7 E7 E7 FF E5 E5 E5 FF E4 E4' + 'E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF DF FF DE DE' + 'DE FF DB DB DB FF D9 D9 D9 FF D8 D8 D8 FF CD CD' + 'CD DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DC DC' + 'DC ED EE EE EE FF ED ED ED FF ED ED ED FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EA EA EA FF E9 E9' + 'E9 FF E8 E8 E8 FF E8 E8 E8 FF E7 E7 E7 FF E5 E5' + 'E5 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF' + 'DF FF DE DE DE FF DB DB DB FF D9 D9 D9 FF CF CF' + 'CF DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DC DC' + 'DC ED EF EF EF FF EE EE EE FF ED ED ED FF ED ED' + 'ED FF EC EC EC FF EB EB EB FF EB EB EB FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E8 E8 E8 FF E7 E7' + 'E7 FF E5 E5 E5 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1' + 'E1 FF DF DF DF FF DE DE DE FF DC DC DC FF D1 D1' + 'D1 DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C0 C0 C0 27 DD DD' + 'DD ED EF EF EF FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF ED ED ED FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF E9 E9 E9 FF E8 E8 E8 FF E8 E8' + 'E8 FF E7 E7 E7 FF E5 E5 E5 FF E4 E4 E4 FF E2 E2' + 'E2 FF E1 E1 E1 FF DF DF DF FF DE DE DE FF D2 D2' + 'D2 DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 27 DE DE' + 'DE ED F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EC EC EC FF EB EB' + 'EB FF EB EB EB FF EA EA EA FF E9 E9 E9 FF E8 E8' + 'E8 FF E7 E7 E7 FF E7 E7 E7 FF E5 E5 E5 FF E4 E4' + 'E4 FF E2 E2 E2 FF E1 E1 E1 FF DF DF DF FF D3 D3' + 'D3 DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 27 DE DE' + 'DE ED F1 F1 F1 FF F0 F0 F0 FF EF EF EF FF EF EF' + 'EF FF EE EE EE FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EA EA EA FF E9 E9' + 'E9 FF E8 E8 E8 FF E7 E7 E7 FF E7 E7 E7 FF E5 E5' + 'E5 FF E4 E4 E4 FF E2 E2 E2 FF E1 E1 E1 FF D6 D6' + 'D6 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 27 DE DE' + 'DE ED F2 F2 F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EC EC EC FF EB EB EB FF EB EB EB FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E7 E7 E7 FF E7 E7' + 'E7 FF E5 E5 E5 FF E4 E4 E4 FF E2 E2 E2 FF D7 D7' + 'D7 DA 23 23 23 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 27 DE DE' + 'DE ED F2 F2 F2 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF EC EC EC FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF E9 E9 E9 FF E8 E8 E8 FF E7 E7' + 'E7 FF E7 E7 E7 FF E5 E5 E5 FF E3 E3 E3 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C4 C4 C4 27 DE DE' + 'DE ED F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EC EC EC FF EB EB' + 'EB FF EB EB EB FF EA EA EA FF E9 E9 E9 FF E8 E8' + 'E8 FF E7 E7 E7 FF E6 E6 E6 FF E5 E5 E5 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 C0 17 95 00 00 00 38 00 A8 44' - 'F9 77 13 00 00 00 18 0A 38 00 00 00 38 00 18 6C' - '38 00 98 17 95 00 00 00 00 00 E0 19 95 00 F0 88' - 'FA 77 70 38 F5 77 FF FF FF FF A8 44 F9 77 70 7D' - 'F5 77 3A 8A F5 77 86 00 00 00 86 00 00 00 08 00' - '00 00 B0 18 95 00 00 00 00 00 CB 44 F9 77 38 9F' - '07 00 CD 8B F5 77 78 13 05 00 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 DF DF' + 'DF ED F5 F5 F5 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2' + 'F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF EF FF EF EF' + 'EF FF EE EE EE FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EA EA EA FF E9 E9' + 'E9 FF E8 E8 E8 FF E7 E7 E7 FF E6 E6 E6 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 DF DF' + 'DF ED F5 F5 F5 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EC EC EC FF EB EB EB FF EB EB EB FF EA EA' + 'EA FF E9 E9 E9 FF E8 E8 E8 FF E7 E7 E7 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 DF DF' + 'DF ED F6 F6 F6 FF F5 F5 F5 FF F5 F5 F5 FF F3 F3' + 'F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF EC EC EC FF EC EC EC FF EB EB EB FF EB EB' + 'EB FF EA EA EA FF E9 E9 E9 FF E8 E8 E8 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 E0 E0' + 'E0 ED F7 F7 F7 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5' + 'F5 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EC EC EC FF EB EB' + 'EB FF EB EB EB FF EA EA EA FF E9 E9 E9 FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 00' - '00 00 00 00 00 00 5A 00 5C 00 00 EC FD 7F 1A 02' - '00 00 4C 16 95 00 40 9F 07 00 FC 15 95 00 FF FF' - 'FF FF B4 1A 95 00 45 00 00 00 28 02 00 00 FF FF' - 'FF FF E2 D8 F5 77 7D 9B F5 77 94 B6 01 00 00 00' - '05 00 F4 17 95 00 80 00 10 C0 B4 1A 95 00 F0 88' - 'FA 77 88 1C F5 77 FF FF FF FF 37 90 F5 77 00 00' - '00 00 3E 8A F5 77 9B B2 E7 77 B7 00 00 00 02 00' - '00 00 A4 1A 95 00 01 00 00 00 18 00 00 00 00 00' - '00 00 10 19 95 00 42 00 00 00 00 00 00 00 F4 18' - '95 00 00 00 00 00 00 00 00 00 00 00 00 00 0C 00' - '00 00 02 00 00 00 01 01 F5 77 00 EC FD 7F 5A 00' - '00 00 00 00 00 00 03 00 00 00 62 00 1A 02 40 9F' - '07 00 00 00 00 00 40 9F 07 00 05 00 00 00 BE B3' - 'E7 77 4C 19 95 00 A3 B4 E7 77 F8 00 00 00 00 00' - '00 C0 00 00 00 00 00 00 00 00 02 00 00 00 80 00' - '00 00 00 00 00 00 8C 1A 95 00 7F E9 4B 00 08 6C' - '0C 01 00 00 00 C0 00 00 00 00 80 1A 95 00 02 00' - '00 00 80 00 00 00 00 00 00 00 C0 27 95 00 C4 F5' - 'AF 00 02 00 00 00 44 3A 5C 6F 73 65 78 70 65 72' - '74 73 5C 72 65 61 63 74 6F 73 5C 6C 69 62 5C 73' - '68 65 6C 6C 33 32 5C 64 6F 63 75 6D 65 6E 74 2E' - '69 63 6F 00 4B 00 14 1A 95 00 1F 3B D4 77 13 00' - '00 00 98 00 00 00 4F 3B D4 77 E0 19 95 00 33 3B' - 'D4 77 64 C5 F5 77 A9 F1 E7 77 F8 00 00 00 00 00' - '00 00 00 00 00 00 00 00 00 00 00 1A 95 00 18 6C' - '38 00 86 00 00 00 00 00 00 00 C9 F1 E7 77 86 00' - '00 00 A4 1A 95 00 08 00 00 00 00 00 00 00 86 00' - '00 00 86 00 00 00 08 00 00 00 F4 19 95 00 33 3B' - 'D4 77 B4 1A 95 00 09 48 E9 77 B8 10 E9 77 FF FF' - 'FF FF C9 F1 E7 77 16 EA 4B 00 F8 00 00 00 18 6C' - '38 00 86 00 00 00 58 1A 95 00 00 00 00 00 00 00' - '00 00 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 10 00 00 00' + '00 00 00 00 00 00 00 00 00 00 CA CA CA 27 E0 E0' + 'E0 ED F7 F7 F7 FF F7 F7 F7 FF F6 F6 F6 FF F5 F5' + 'F5 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2' + 'F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF EF FF EF EF' + 'EF FF EE EE EE FF ED ED ED FF EC EC EC FF EC EC' + 'EC FF EB EB EB FF EB EB EB FF EA EA EA FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 00 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 DF DF' + 'DF ED F8 F8 F8 FF F7 F7 F7 FF F7 F7 F7 FF F6 F6' + 'F6 FF F5 F5 F5 FF F5 F5 F5 FF F3 F3 F3 FF F2 F2' + 'F2 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0 F0 FF EF EF' + 'EF FF EF EF EF FF EE EE EE FF ED ED ED FF EC EC' + 'EC FF EC EC EC FF EB EB EB FF EB EB EB FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 00' + '00 00 00 00 00 00 00 00 00 00 C7 C7 C7 27 E0 E0' + 'E0 ED FA FA FA FF F8 F8 F8 FF F7 F7 F7 FF F7 F7' + 'F7 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5 F5 FF F3 F3' + 'F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1 F1 FF F0 F0' + 'F0 FF EF EF EF FF EF EF EF FF EE EE EE FF ED ED' + 'ED FF EC EC EC FF EC EC EC FF EB EB EB FF D9 D9' + 'D9 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 08 08 06 08 08 06 08 06 06 08 06 08' - '06 06 06 06 06 06 06 05 06 05 05 01 10 10 10 10' + '00 00 00 00 00 00 00 00 00 00 CA CA CA 27 E0 E0' + 'E0 ED FA FA FA FF FA FA FA FF F8 F8 F8 FF F7 F7' + 'F7 FF F7 F7 F7 FF F6 F6 F6 FF F5 F5 F5 FF F5 F5' + 'F5 FF F3 F3 F3 FF F2 F2 F2 FF F2 F2 F2 FF F1 F1' + 'F1 FF F0 F0 F0 FF EF EF EF FF EF EF EF FF EE EE' + 'EE FF ED ED ED FF EC EC EC FF EC EC EC FF D8 D8' + 'D8 DA 26 26 26 4E 00 00 00 00 00 00 00 00 00 00' '00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0D' - '0E 0E 0E 0E 0E 0E 0E 0E 0E 0C 08 05 01 10 10 10' - '10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0E 0D' - '0D 0D 0D 0E 0D 0D 0D 0E 0E 0B 09 0A 05 01 10 10' - '10 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0B 0F 0C 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0D 0D 0D 0D 0D 0D 0D 0D 0D 0B 0A 0D 0A 05 02 10' - '10 10 10 00 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0E 0D 0D 0D 0D 0E 0D 0D 0E 0A 0A 0E 0D 09 06 01' - '10 10 10 10 00 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0E 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0D 0D 0D 0D 0D 0D 0D 0E 0D 0B 0A 0E 0D 0E 0A 06' - '01 10 10 10 10 00 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0D 0D' - '0D 0D 0D 0E 0D 0D 0D 0D 0E 0B 0A 0E 0E 0E 0E 0A' - '05 01 10 10 10 10 00 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0D 0D 0D 0D 0D 0D 0E 0D' - '0D 0E 0D 0D 0D 0D 0E 0D 0E 0B 0A 0E 0E 0E 0E 0F' - '0A 06 01 10 10 10 10 00 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0E 0D 0D 0D 0E 0D 0D 0D 0D' - '0E 0D 0E 0D 0E 0D 0D 0E 0D 0B 0A 0E 0F 0E 0E 0E' - '0F 0A 05 01 10 10 10 10 00 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0D 0E 0D 0D 0D 0E 0D 0E' - '0D 0D 0D 0E 0D 0D 0E 0D 0E 0B 0A 0F 0E 0E 0F 0E' - '0F 0E 0B 05 02 10 10 10 10 00 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0D 0E 0D 0D 0E 0D 0D 0E 0D' - '0E 0D 0E 0D 0E 0E 0D 0E 0E 0B 0B 0E 0F 0E 0E 0F' - '0E 0F 0F 0B 05 01 10 10 10 10 00 00 00 00 00 00' - '00 10 10 03 0C 0F 0E 0D 0D 0D 0E 0D 0E 0D 0D 0E' - '0D 0E 0D 0E 0D 0D 0E 0D 0E 0B 0A 0F 0E 0F 0F 0F' - '0F 0F 0F 0F 0B 06 01 10 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0E 0D 0E 0D 0D 0E 0E 0D 0E' - '0D 0D 0E 0D 0E 0E 0D 0E 0E 0B 0B 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0B 05 02 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0E 0D 0E 0D 0E 0E 0D 0D 0E 0D' - '0E 0E 0D 0E 0E 0D 0E 0E 0E 0B 09 0B 0B 0B 0A 0B' - '0B 0A 0B 0A 0B 0B 09 05 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0E 0D 0D 0E 0D 0D 0E 0E 0D 0E' - '0D 0E 0E 0D 0E 0E 0E 0D 0E 0D 0C 0C 0C 0C 0C 0C' - '0C 0C 0C 0C 0B 0C 0C 06 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0E 0E 0D 0E 0E 0E 0D 0E 0E' - '0E 0E 0D 0E 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0F 0E 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0E 0D 0E 0E 0D 0E 0E 0E 0D 0E' - '0E 0D 0E 0E 0D 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0F 0D 06 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0D 0E 0E 0E 0E 0D 0E 0D 0E 0E' - '0D 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0F 0E 0E 0E 0E 0E 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0F 0D 06 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F 0E' - '0E 0E 0E 0F 0E 0E 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E' - '0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E' - '0E 0F 0E 0E 0E 0F 0E 06 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0F 0E 0E 0E 0F 0E 0F 0E 0F 0E' - '0F 0E 0E 0E 0E 0E 0E 0F 0E 0E 0E 0E 0E 0E 0E 0F' - '0E 0E 0F 0E 0F 0E 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0E 0E 0E 0F 0E 0E 0E 0F 0E 0F' - '0E 0F 0E 0F 0F 0E 0F 0E 0F 0E 0F 0E 0F 0E 0E 0E' - '0F 0E 0E 0E 0E 0F 0E 06 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0E 0E 0F 0E 0E 0E 0F 0E 0F 0E' - '0F 0E 0F 0F 0E 0F 0F 0F 0E 0F 0F 0F 0E 0F 0E 0F' - '0E 0F 0E 0F 0F 0E 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0E 0E 0E 0F 0E 0F 0E 0E 0F 0F' - '0E 0F 0F 0E 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F 0F 0E' - '0F 0E 0E 0E 0F 0F 0E 06 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0E 0F 0E 0F 0E 0F 0F 0F 0E' - '0F 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0E 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0E 0F 0E 0F 0E 0F 0E 0F 0E 0F' - '0F 0E 0F 0E 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 06 01 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0E 0E 0F 0F 0E 0F 0E 0F 0E' - '0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0E 0F 0F 0E 0E 0F 0F 0F 0F 0F' - '0E 0F 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 06 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0F 0E 0F 0F 0F 0E 0F 0F 0E' - '0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0E 0F 0F 0E 0F 0F 0F 0E 0F 0F' - '0F 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0C 0F 0F 0E 0F 0F 0F 0E 0F 0F 0F 0F' - '0F 0E 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0F 0F 0E 0F 0F 0F 0F 0F 0E 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0F 0E 0F 0F 0F 0F 0E 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0F 0F 0F 0E 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0F 0F 0E 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 03 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0C 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F' - '0F 0F 0F 0F 0F 0F 0E 08 10 10 10 00 00 00 00 00' - '00 10 10 04 0D 0F 0F 0F 0F 0F 0F 0F 0F 0E 0F 0F' - '0E 0F 0E 0F 0E 0F 0F 0E 0F 0E 0F 0F 0F 0F 0E 0F' - '0F 0F 0E 0F 0E 0F 0E 09 10 10 10 00 00 00 00 00' - '00 10 10 02 0A 09 09 09 09 09 09 09 09 09 09 09' - '09 09 09 08 09 09 08 09 08 09 08 08 08 08 08 08' - '08 08 08 08 08 08 08 05 10 10 10 00 00 00 00 00' - '00 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 00 00 00 00 00' - '00 00 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10' - '10 10 10 10 10 10 10 10 10 10 00 00 00 00 F0 00' - '00 01 FF FF 00 00 E0 00 00 00 FF FF 00 00 E0 00' - '00 00 7F FF 00 00 E0 00 00 00 3F FF 00 00 E0 00' - '00 00 1F FF 00 00 E0 00 00 00 0F FF 00 00 E0 00' - '00 00 07 FF 00 00 E0 00 00 00 03 FF 00 00 E0 00' - '00 00 01 FF 00 00 E0 00 00 00 00 FF 00 00 E0 00' - '00 00 00 7F 00 00 E0 00 00 00 00 3F 00 00 E0 00' - '00 00 00 1F 00 00 E0 00 00 00 00 0F 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' - '00 00 00 07 00 00 E0 00 00 00 00 07 00 00 E0 00' [truncated at 1000 lines; 3419 more skipped]
19 years, 8 months
1
0
0
0
[sedwards] 14548: wow it really does work on linux now
by sedwards@svn.reactos.com
wow it really does work on linux now Modified: branches/xmlbuildsystem/reactos/tools/unicode/unicode.mak _____ Modified: branches/xmlbuildsystem/reactos/tools/unicode/unicode.mak --- branches/xmlbuildsystem/reactos/tools/unicode/unicode.mak 2005-04-08 13:14:15 UTC (rev 14547) +++ branches/xmlbuildsystem/reactos/tools/unicode/unicode.mak 2005-04-08 16:58:29 UTC (rev 14548) @@ -97,7 +97,7 @@ UNICODE_HOST_CFLAGS = \ -D__USE_W32API -DWINVER=0x501 -DWINE_UNICODE_API= \ -Dwchar_t="unsigned short" -D_WCHAR_T_DEFINED \ - -I$(UNICODE_BASE) -Iinclude/wine + -I$(UNICODE_BASE) -Iinclude/wine -Iw32api/include .PHONY: unicode unicode: $(UNICODE_TARGET)
19 years, 8 months
1
0
0
0
[royce] 14547: use tags for pool allocations, and reformat code
by royce@svn.reactos.com
use tags for pool allocations, and reformat code Modified: trunk/reactos/ntoskrnl/ps/job.c _____ Modified: trunk/reactos/ntoskrnl/ps/job.c --- trunk/reactos/ntoskrnl/ps/job.c 2005-04-08 13:02:23 UTC (rev 14546) +++ trunk/reactos/ntoskrnl/ps/job.c 2005-04-08 13:14:15 UTC (rev 14547) @@ -1,10 +1,10 @@ /* $Id$ - * + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/ps/job.c * PURPOSE: Job Native Functions - * + * * PROGRAMMERS: Alex Ionescu (alex(a)relsoft.net) (stubs) * Thomas Weidenmueller <w3seek(a)reactos.com> */ @@ -17,281 +17,293 @@ /* GLOBALS *******************************************************************/ +#define TAG_EJOB TAG('E', 'J', 'O', 'B') /* EJOB */ + POBJECT_TYPE EXPORTED PsJobType = NULL; LIST_ENTRY PsJobListHead; static FAST_MUTEX PsJobListLock; -static GENERIC_MAPPING PiJobMapping = {STANDARD_RIGHTS_READ | JOB_OBJECT_QUERY, - STANDARD_RIGHTS_WRITE | JOB_OBJECT_ASSIGN_PROCESS | JOB_OBJECT_SET_ATTRIBUTES | JOB_OBJECT_TERMINATE | JOB_OBJECT_SET_SECURITY_ATTRIBUTES, - STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, - STANDARD_RIGHTS_ALL | JOB_OBJECT_ALL_ACCESS}; +static GENERIC_MAPPING PiJobMapping = +{ + STANDARD_RIGHTS_READ | JOB_OBJECT_QUERY, + STANDARD_RIGHTS_WRITE | JOB_OBJECT_ASSIGN_PROCESS | JOB_OBJECT_SET_ATTRIBUTES | JOB_OBJECT_TERMINATE | JOB_OBJECT_SET_SECURITY_ATTRIBUTES, + STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, + STANDARD_RIGHTS_ALL | JOB_OBJECT_ALL_ACCESS +}; /* FUNCTIONS *****************************************************************/ VOID STDCALL -PiDeleteJob(PVOID ObjectBody) +PiDeleteJob ( PVOID ObjectBody ) { - PEJOB Job = (PEJOB)ObjectBody; - - /* remove the reference to the completion port if associated */ - if(Job->CompletionPort != NULL) - { - ObDereferenceObject(Job->CompletionPort); - } + PEJOB Job = (PEJOB)ObjectBody; - /* unlink the job object */ - if(Job->JobLinks.Flink != NULL) - { - ExAcquireFastMutex(&PsJobListLock); - RemoveEntryList(&Job->JobLinks); - ExReleaseFastMutex(&PsJobListLock); - } - - ExDeleteResource(&Job->JobLock); + /* remove the reference to the completion port if associated */ + if(Job->CompletionPort != NULL) + { + ObDereferenceObject(Job->CompletionPort); + } + + /* unlink the job object */ + if(Job->JobLinks.Flink != NULL) + { + ExAcquireFastMutex(&PsJobListLock); + RemoveEntryList(&Job->JobLinks); + ExReleaseFastMutex(&PsJobListLock); + } + + ExDeleteResource(&Job->JobLock); } VOID INIT_FUNCTION -PsInitJobManagment(VOID) +PsInitJobManagment ( VOID ) { - PsJobType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE)); + PsJobType = ExAllocatePoolWithTag ( + NonPagedPool, sizeof(OBJECT_TYPE), TAG_EJOB ); - PsJobType->Tag = TAG('E', 'J', 'O', 'B'); - PsJobType->TotalObjects = 0; - PsJobType->TotalHandles = 0; - PsJobType->PeakObjects = 0; - PsJobType->PeakHandles = 0; - PsJobType->PagedPoolCharge = 0; - PsJobType->NonpagedPoolCharge = sizeof(EJOB); - PsJobType->Mapping = &PiJobMapping; - PsJobType->Dump = NULL; - PsJobType->Open = NULL; - PsJobType->Close = NULL; - PsJobType->Delete = PiDeleteJob; - PsJobType->Parse = NULL; - PsJobType->Security = NULL; - PsJobType->QueryName = NULL; - PsJobType->OkayToClose = NULL; - PsJobType->Create = NULL; - PsJobType->DuplicationNotify = NULL; - - RtlInitUnicodeString(&PsJobType->TypeName, L"Job"); - - ObpCreateTypeObject(PsJobType); - - InitializeListHead(&PsJobListHead); - ExInitializeFastMutex(&PsJobListLock); + PsJobType->Tag = TAG_EJOB; + PsJobType->TotalObjects = 0; + PsJobType->TotalHandles = 0; + PsJobType->PeakObjects = 0; + PsJobType->PeakHandles = 0; + PsJobType->PagedPoolCharge = 0; + PsJobType->NonpagedPoolCharge = sizeof(EJOB); + PsJobType->Mapping = &PiJobMapping; + PsJobType->Dump = NULL; + PsJobType->Open = NULL; + PsJobType->Close = NULL; + PsJobType->Delete = PiDeleteJob; + PsJobType->Parse = NULL; + PsJobType->Security = NULL; + PsJobType->QueryName = NULL; + PsJobType->OkayToClose = NULL; + PsJobType->Create = NULL; + PsJobType->DuplicationNotify = NULL; + + RtlInitUnicodeString(&PsJobType->TypeName, L"Job"); + + ObpCreateTypeObject(PsJobType); + + InitializeListHead(&PsJobListHead); + ExInitializeFastMutex(&PsJobListLock); } NTSTATUS -PspAssignProcessToJob(PEPROCESS Process, - PEJOB Job) +PspAssignProcessToJob ( + PEPROCESS Process, + PEJOB Job) { - DPRINT("PspAssignProcessToJob() is unimplemented!\n"); - return STATUS_NOT_IMPLEMENTED; + DPRINT("PspAssignProcessToJob() is unimplemented!\n"); + return STATUS_NOT_IMPLEMENTED; } NTSTATUS -PspTerminateJobObject(PEJOB Job, - KPROCESSOR_MODE AccessMode, - NTSTATUS ExitStatus) +PspTerminateJobObject ( + PEJOB Job, + KPROCESSOR_MODE AccessMode, + NTSTATUS ExitStatus ) { - DPRINT("PspTerminateJobObject() is unimplemented!\n"); - return STATUS_NOT_IMPLEMENTED; + DPRINT("PspTerminateJobObject() is unimplemented!\n"); + return STATUS_NOT_IMPLEMENTED; } /* * @unimplemented */ -NTSTATUS -STDCALL -NtAssignProcessToJobObject(HANDLE JobHandle, - HANDLE ProcessHandle) +NTSTATUS +STDCALL +NtAssignProcessToJobObject ( + HANDLE JobHandle, + HANDLE ProcessHandle) { - PEPROCESS Process; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status; - - PAGED_CODE(); - - PreviousMode = ExGetPreviousMode(); - - /* make sure we're having a handle with enough rights, especially the to - terminate the process. otherwise one could abuse the job objects to - terminate processes without having rights granted to do so! The reason - I open the process handle before the job handle is that a simple test showed - that it first complains about a invalid process handle! The other way around - would be simpler though... */ - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_TERMINATE, - PsProcessType, - PreviousMode, - (PVOID*)&Process, - NULL); - if(NT_SUCCESS(Status)) - { - if(Process->Job == NULL) + PEPROCESS Process; + KPROCESSOR_MODE PreviousMode; + NTSTATUS Status; + + PAGED_CODE(); + + PreviousMode = ExGetPreviousMode(); + + /* make sure we're having a handle with enough rights, especially the to + terminate the process. otherwise one could abuse the job objects to + terminate processes without having rights granted to do so! The reason + I open the process handle before the job handle is that a simple test showed + that it first complains about a invalid process handle! The other way around + would be simpler though... */ + Status = ObReferenceObjectByHandle( + ProcessHandle, + PROCESS_TERMINATE, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if(NT_SUCCESS(Status)) { - PEJOB Job; - - Status = ObReferenceObjectByHandle(JobHandle, - JOB_OBJECT_ASSIGN_PROCESS, - PsJobType, - PreviousMode, - (PVOID*)&Job, - NULL); - if(NT_SUCCESS(Status)) - { - /* lock the process so we can safely assign the process. Note that in the - meanwhile another thread could have assigned this process to a job! */ + if(Process->Job == NULL) + { + PEJOB Job; - Status = PsLockProcess(Process, FALSE); - if(NT_SUCCESS(Status)) + Status = ObReferenceObjectByHandle( + JobHandle, + JOB_OBJECT_ASSIGN_PROCESS, + PsJobType, + PreviousMode, + (PVOID*)&Job, + NULL); + if(NT_SUCCESS(Status)) + { + /* lock the process so we can safely assign the process. Note that in the + meanwhile another thread could have assigned this process to a job! */ + + Status = PsLockProcess(Process, FALSE); + if(NT_SUCCESS(Status)) + { + if(Process->Job == NULL && Process->SessionId == Job->SessionId) + { + /* Just store the pointer to the job object in the process, we'll + assign it later. The reason we can't do this here is that locking + the job object might require it to wait, which is a bad thing + while holding the process lock! */ + Process->Job = Job; + } + else + { + /* process is already assigned to a job or session id differs! */ + Status = STATUS_ACCESS_DENIED; + } + PsUnlockProcess(Process); + + if(NT_SUCCESS(Status)) + { + /* let's actually assign the process to the job as we're not holding + the process lock anymore! */ + Status = PspAssignProcessToJob(Process, Job); + } + } + + ObDereferenceObject(Job); + } + } + else { - if(Process->Job == NULL && Process->SessionId == Job->SessionId) - { - /* Just store the pointer to the job object in the process, we'll - assign it later. The reason we can't do this here is that locking - the job object might require it to wait, which is a bad thing - while holding the process lock! */ - Process->Job = Job; - } - else - { /* process is already assigned to a job or session id differs! */ Status = STATUS_ACCESS_DENIED; - } - PsUnlockProcess(Process); - - if(NT_SUCCESS(Status)) - { - /* let's actually assign the process to the job as we're not holding - the process lock anymore! */ - Status = PspAssignProcessToJob(Process, Job); - } } - ObDereferenceObject(Job); - } + ObDereferenceObject(Process); } - else - { - /* process is already assigned to a job or session id differs! */ - Status = STATUS_ACCESS_DENIED; - } - - ObDereferenceObject(Process); - } - return Status; + return Status; } /* * @unimplemented */ -NTSTATUS -STDCALL -NtCreateJobObject(PHANDLE JobHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes) +NTSTATUS +STDCALL +NtCreateJobObject ( + PHANDLE JobHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes ) { - HANDLE hJob; - PEJOB Job; - KPROCESSOR_MODE PreviousMode; - PEPROCESS CurrentProcess; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); + HANDLE hJob; + PEJOB Job; + KPROCESSOR_MODE PreviousMode; + PEPROCESS CurrentProcess; + NTSTATUS Status = STATUS_SUCCESS; - PreviousMode = ExGetPreviousMode(); - CurrentProcess = PsGetCurrentProcess(); + PAGED_CODE(); - /* check for valid buffers */ - if(PreviousMode == UserMode) - { - _SEH_TRY + PreviousMode = ExGetPreviousMode(); + CurrentProcess = PsGetCurrentProcess(); + + /* check for valid buffers */ + if(PreviousMode == UserMode) { - /* probe with 32bit alignment */ - ProbeForWrite(JobHandle, - sizeof(HANDLE), - sizeof(ULONG)); + _SEH_TRY + { + /* probe with 32bit alignment */ + ProbeForWrite(JobHandle, + sizeof(HANDLE), + sizeof(ULONG)); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + if(!NT_SUCCESS(Status)) + { + return Status; + } } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - if(!NT_SUCCESS(Status)) - { - return Status; - } - } - - Status = ObCreateObject(PreviousMode, - PsJobType, - ObjectAttributes, - PreviousMode, - NULL, - sizeof(EJOB), - 0, - 0, - (PVOID*)&Job); - - if(NT_SUCCESS(Status)) - { - /* FIXME - Zero all fields as we don't yet implement all of them */ - RtlZeroMemory(Job, sizeof(EJOB)); - - /* make sure that early destruction doesn't attempt to remove the object from - the list before it even gets added! */ - Job->JobLinks.Flink = NULL; - - /* setup the job object */ - InitializeListHead(&Job->ProcessListHead); - Job->SessionId = CurrentProcess->SessionId; /* inherit the session id from the caller */ - - Status = ExInitializeResource(&Job->JobLock); - if(!NT_SUCCESS(Status)) - { - DPRINT1("Failed to initialize job lock!!!\n"); - ObDereferenceObject(Job); - return Status; - } - KeInitializeEvent(&Job->Event, NotificationEvent, FALSE); - - /* link the object into the global job list */ - ExAcquireFastMutex(&PsJobListLock); - InsertTailList(&PsJobListHead, &Job->JobLinks); - ExReleaseFastMutex(&PsJobListLock); - - Status = ObInsertObject(Job, - NULL, - DesiredAccess, - 0, - NULL, - &hJob); + Status = ObCreateObject(PreviousMode, + PsJobType, + ObjectAttributes, + PreviousMode, + NULL, + sizeof(EJOB), + 0, + 0, + (PVOID*)&Job); + if(NT_SUCCESS(Status)) { - /* pass the handle back to the caller */ - _SEH_TRY - { - /* NOTE: if the caller passed invalid buffers to receive the handle it's his - own fault! the object will still be created and live... It's possible - to find the handle using ObFindHandleForObject()! */ - *JobHandle = hJob; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; + /* FIXME - Zero all fields as we don't yet implement all of them */ + RtlZeroMemory(Job, sizeof(EJOB)); + + /* make sure that early destruction doesn't attempt to remove the object from + the list before it even gets added! */ + Job->JobLinks.Flink = NULL; + + /* setup the job object */ + InitializeListHead(&Job->ProcessListHead); + Job->SessionId = CurrentProcess->SessionId; /* inherit the session id from the caller */ + + Status = ExInitializeResource(&Job->JobLock); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to initialize job lock!!!\n"); + ObDereferenceObject(Job); + return Status; + } + KeInitializeEvent(&Job->Event, NotificationEvent, FALSE); + + /* link the object into the global job list */ + ExAcquireFastMutex(&PsJobListLock); + InsertTailList(&PsJobListHead, &Job->JobLinks); + ExReleaseFastMutex(&PsJobListLock); + + Status = ObInsertObject(Job, + NULL, + DesiredAccess, + 0, + NULL, + &hJob); + if(NT_SUCCESS(Status)) + { + /* pass the handle back to the caller */ + _SEH_TRY + { + /* NOTE: if the caller passed invalid buffers to receive the handle it's his + own fault! the object will still be created and live... It's possible + to find the handle using ObFindHandleForObject()! */ + *JobHandle = hJob; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } } - } - - return Status; + + return Status; } @@ -300,195 +312,203 @@ */ NTSTATUS STDCALL -NtIsProcessInJob(IN HANDLE ProcessHandle, - IN HANDLE JobHandle OPTIONAL) +NtIsProcessInJob ( + IN HANDLE ProcessHandle, + IN HANDLE JobHandle OPTIONAL ) { - KPROCESSOR_MODE PreviousMode; - PEPROCESS Process; - NTSTATUS Status; - - PreviousMode = ExGetPreviousMode(); - - PAGED_CODE(); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_QUERY_INFORMATION, - PsProcessType, - PreviousMode, - (PVOID*)&Process, - NULL); - if(NT_SUCCESS(Status)) - { - /* FIXME - make sure the job object doesn't get exchanged or deleted while trying to - reference it, e.g. by locking it somehow until it is referenced... */ + KPROCESSOR_MODE PreviousMode; + PEPROCESS Process; + NTSTATUS Status; - PEJOB ProcessJob = Process->Job; - - if(ProcessJob != NULL) + PreviousMode = ExGetPreviousMode(); + + PAGED_CODE(); + + Status = ObReferenceObjectByHandle( + ProcessHandle, + PROCESS_QUERY_INFORMATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if(NT_SUCCESS(Status)) { - if(JobHandle == NULL) - { - /* the process is assigned to a job */ - Status = STATUS_PROCESS_IN_JOB; - } - else /* JobHandle != NULL */ - { - PEJOB JobObject; + /* FIXME - make sure the job object doesn't get exchanged or deleted while trying to + reference it, e.g. by locking it somehow until it is referenced... */ - /* get the job object and compare the object pointer with the one assigned to the process */ - Status = ObReferenceObjectByHandle(JobHandle, - JOB_OBJECT_QUERY, - PsJobType, - PreviousMode, - (PVOID*)&JobObject, - NULL); - if(NT_SUCCESS(Status)) + PEJOB ProcessJob = Process->Job; + + if(ProcessJob != NULL) { - Status = ((ProcessJob == JobObject) ? STATUS_PROCESS_IN_JOB : STATUS_PROCESS_NOT_IN_JOB); - ObDereferenceObject(JobObject); + if(JobHandle == NULL) + { + /* the process is assigned to a job */ + Status = STATUS_PROCESS_IN_JOB; + } + else /* JobHandle != NULL */ + { + PEJOB JobObject; + + /* get the job object and compare the object pointer with the one assigned to the process */ + Status = ObReferenceObjectByHandle(JobHandle, + JOB_OBJECT_QUERY, + PsJobType, + PreviousMode, + (PVOID*)&JobObject, + NULL); + if(NT_SUCCESS(Status)) + { + Status = ((ProcessJob == JobObject) ? STATUS_PROCESS_IN_JOB : STATUS_PROCESS_NOT_IN_JOB); + ObDereferenceObject(JobObject); + } + } } - } + else + { + /* the process is not assigned to any job */ + Status = STATUS_PROCESS_NOT_IN_JOB; + } + ObDereferenceObject(Process); } - else - { - /* the process is not assigned to any job */ - Status = STATUS_PROCESS_NOT_IN_JOB; - } - ObDereferenceObject(Process); - } - return Status; + return Status; } /* * @implemented */ -NTSTATUS -STDCALL -NtOpenJobObject(PHANDLE JobHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes) +NTSTATUS +STDCALL +NtOpenJobObject ( + PHANDLE JobHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes) { - KPROCESSOR_MODE PreviousMode; - HANDLE hJob; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); + KPROCESSOR_MODE PreviousMode; + HANDLE hJob; + NTSTATUS Status = STATUS_SUCCESS; - PreviousMode = ExGetPreviousMode(); + PAGED_CODE(); - /* check for valid buffers */ - if(PreviousMode == UserMode) - { - _SEH_TRY + PreviousMode = ExGetPreviousMode(); + + /* check for valid buffers */ + if(PreviousMode == UserMode) { - /* probe with 32bit alignment */ - ProbeForWrite(JobHandle, - sizeof(HANDLE), - sizeof(ULONG)); + _SEH_TRY + { + /* probe with 32bit alignment */ + ProbeForWrite(JobHandle, + sizeof(HANDLE), + sizeof(ULONG)); + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + if(!NT_SUCCESS(Status)) + { + return Status; + } } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - - if(!NT_SUCCESS(Status)) - { - return Status; - } - } - - if(NT_SUCCESS(Status)) - { - Status = ObOpenObjectByName(ObjectAttributes, - PsJobType, - NULL, - PreviousMode, - DesiredAccess, - NULL, - &hJob); + if(NT_SUCCESS(Status)) { - _SEH_TRY - { - *JobHandle = hJob; - } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; + Status = ObOpenObjectByName(ObjectAttributes, + PsJobType, + NULL, + PreviousMode, + DesiredAccess, + NULL, + &hJob); + if(NT_SUCCESS(Status)) + { + _SEH_TRY + { + *JobHandle = hJob; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } } - } - - return Status; + + return Status; } /* * @unimplemented */ -NTSTATUS -STDCALL -NtQueryInformationJobObject(HANDLE JobHandle, - JOBOBJECTINFOCLASS JobInformationClass, - PVOID JobInformation, - ULONG JobInformationLength, - PULONG ReturnLength) +NTSTATUS +STDCALL +NtQueryInformationJobObject ( + HANDLE JobHandle, + JOBOBJECTINFOCLASS JobInformationClass, + PVOID JobInformation, + ULONG JobInformationLength, + PULONG ReturnLength ) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* * @unimplemented */ -NTSTATUS -STDCALL -NtSetInformationJobObject(HANDLE JobHandle, - JOBOBJECTINFOCLASS JobInformationClass, - PVOID JobInformation, - ULONG JobInformationLength) +NTSTATUS +STDCALL +NtSetInformationJobObject ( + HANDLE JobHandle, + JOBOBJECTINFOCLASS JobInformationClass, + PVOID JobInformation, + ULONG JobInformationLength) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* * @unimplemented */ -NTSTATUS -STDCALL -NtTerminateJobObject(HANDLE JobHandle, - NTSTATUS ExitStatus) +NTSTATUS +STDCALL +NtTerminateJobObject ( + HANDLE JobHandle, + NTSTATUS ExitStatus ) { - KPROCESSOR_MODE PreviousMode; - PEJOB Job; - NTSTATUS Status; - - PAGED_CODE(); - - PreviousMode = ExGetPreviousMode(); - - Status = ObReferenceObjectByHandle(JobHandle, - JOB_OBJECT_TERMINATE, - PsJobType, - PreviousMode, - (PVOID*)&Job, - NULL); - if(NT_SUCCESS(Status)) - { - Status = PspTerminateJobObject(Job, - PreviousMode, - ExitStatus); - ObDereferenceObject(Job); - } - - return Status; + KPROCESSOR_MODE PreviousMode; + PEJOB Job; + NTSTATUS Status; + + PAGED_CODE(); + + PreviousMode = ExGetPreviousMode(); + + Status = ObReferenceObjectByHandle( + JobHandle, + JOB_OBJECT_TERMINATE, + PsJobType, + PreviousMode, + (PVOID*)&Job, + NULL); + if(NT_SUCCESS(Status)) + { + Status = PspTerminateJobObject( + Job, + PreviousMode, + ExitStatus); + ObDereferenceObject(Job); + } + + return Status; } @@ -496,11 +516,11 @@ * @implemented */ PVOID -STDCALL -PsGetJobLock(PEJOB Job) +STDCALL +PsGetJobLock ( PEJOB Job ) { - ASSERT(Job); - return (PVOID)&Job->JobLock; + ASSERT(Job); + return (PVOID)&Job->JobLock; } @@ -509,10 +529,10 @@ */ PVOID STDCALL -PsGetJobSessionId(PEJOB Job) +PsGetJobSessionId ( PEJOB Job ) { - ASSERT(Job); - return (PVOID)Job->SessionId; + ASSERT(Job); + return (PVOID)Job->SessionId; } @@ -521,10 +541,10 @@ */ ULONG STDCALL -PsGetJobUIRestrictionsClass(PEJOB Job) +PsGetJobUIRestrictionsClass ( PEJOB Job ) { - ASSERT(Job); - return Job->UIRestrictionsClass; + ASSERT(Job); + return Job->UIRestrictionsClass; } @@ -533,12 +553,13 @@ */ VOID STDCALL -PsSetJobUIRestrictionsClass(PEJOB Job, - ULONG UIRestrictionsClass) +PsSetJobUIRestrictionsClass ( + PEJOB Job, + ULONG UIRestrictionsClass) { - ASSERT(Job); - InterlockedExchangeUL(&Job->UIRestrictionsClass, UIRestrictionsClass); - /* FIXME - walk through the job process list and update the restrictions? */ + ASSERT(Job); + InterlockedExchangeUL(&Job->UIRestrictionsClass, UIRestrictionsClass); + /* FIXME - walk through the job process list and update the restrictions? */ } /* EOF */
19 years, 8 months
1
0
0
0
[arty] 14543: Read: Generalized EOF condition slightly.
by arty@svn.reactos.com
Read: Generalized EOF condition slightly. Remember to check for failure when locking address buffer. Lock: SEH to protect from bad address length ptr. Modified: trunk/reactos/drivers/net/afd/afd/lock.c Modified: trunk/reactos/drivers/net/afd/afd/read.c _____ Modified: trunk/reactos/drivers/net/afd/afd/lock.c --- trunk/reactos/drivers/net/afd/afd/lock.c 2005-04-08 05:35:20 UTC (rev 14542) +++ trunk/reactos/drivers/net/afd/afd/lock.c 2005-04-08 11:04:13 UTC (rev 14543) @@ -11,6 +11,7 @@ #include "tdi_proto.h" #include "tdiconn.h" #include "debug.h" +#include "pseh.h" /* Lock a method_neither request so it'll be available from DISPATCH_LEVEL */ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) { @@ -49,21 +50,31 @@ UINT Size = sizeof(AFD_WSABUF) * (Count + Lock); PAFD_WSABUF NewBuf = ExAllocatePool( PagedPool, Size * 2 ); PMDL NewMdl; + INT NewBufferLen; AFD_DbgPrint(MID_TRACE,("Called\n")); if( NewBuf ) { PAFD_MAPBUF MapBuf = (PAFD_MAPBUF)(NewBuf + Count + Lock); - RtlCopyMemory( NewBuf, Buf, sizeof(AFD_WSABUF) * Count ); + _SEH_TRY { + RtlCopyMemory( NewBuf, Buf, sizeof(AFD_WSABUF) * Count ); + NewBufferLen = *AddressLen; + } _SEH_HANDLE { + AFD_DbgPrint(MIN_TRACE,("Access violation copying buffer info " + "from userland (%x %x)\n", + Buf, AddressLen)); + ExFreePool( NewBuf ); + return NULL; + } _SEH_END; - if( LockAddress ) { - NewBuf[Count].buf = AddressBuf; - NewBuf[Count].len = *AddressLen; - Count++; - NewBuf[Count].buf = (PVOID)AddressLen; - NewBuf[Count].len = sizeof(*AddressLen); - Count++; + if( LockAddress ) { + NewBuf[Count].buf = AddressBuf; + NewBuf[Count].len = NewBufferLen; + Count++; + NewBuf[Count].buf = (PVOID)AddressLen; + NewBuf[Count].len = sizeof(*AddressLen); + Count++; } for( i = 0; i < Count; i++ ) { _____ Modified: trunk/reactos/drivers/net/afd/afd/read.c --- trunk/reactos/drivers/net/afd/afd/read.c 2005-04-08 05:35:20 UTC (rev 14542) +++ trunk/reactos/drivers/net/afd/afd/read.c 2005-04-08 11:04:13 UTC (rev 14543) @@ -33,6 +33,14 @@ (FCB->PollState & (AFD_EVENT_CLOSE | AFD_EVENT_DISCONNECT)); } +VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, UINT Information ) { + if( Status == STATUS_SUCCESS && Information == 0 ) { + AFD_DbgPrint(MID_TRACE,("Looks like an EOF\n")); + FCB->PollState |= AFD_EVENT_CLOSE /*| AFD_EVENT_DISCONNECT */; + PollReeval( FCB->DeviceExt, FCB->FileObject ); + } +} + NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB, PAFD_RECV_INFO RecvReq, PUINT TotalBytesCopied ) { @@ -101,15 +109,9 @@ ReceiveComplete, FCB ); - if( Status == STATUS_SUCCESS ) { - if( !FCB->ReceiveIrp.Iosb.Information ) { - AFD_DbgPrint(MID_TRACE,("Looks like an EOF\n")); - FCB->PollState |= AFD_EVENT_DISCONNECT; - PollReeval( FCB->DeviceExt, FCB->FileObject ); - } - FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information; - } - + if( Status == STATUS_SUCCESS ) + FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information; + HandleEOFOnIrp( FCB, Status, FCB->Recv.Content ); SocketCalloutLeave( FCB ); } } @@ -149,6 +151,8 @@ if( NextIrp == Irp ) RetStatus = Status; IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT ); FCB->Overread = TRUE; + //FCB->PollState |= AFD_EVENT_DISCONNECT; + PollReeval( FCB->DeviceExt, FCB->FileObject ); } } else { /* Kick the user that receive would be possible now */ @@ -233,14 +237,8 @@ return STATUS_UNSUCCESSFUL; } - Status = FCB->ReceiveIrp.Iosb.Status; + HandleEOFOnIrp( FCB, Irp->IoStatus.Status, Irp->IoStatus.Information ); - if( Irp->IoStatus.Status == STATUS_SUCCESS && - Irp->IoStatus.Information == 0 ) { - AFD_DbgPrint(MID_TRACE,("Looks like an EOF\n")); - FCB->PollState |= AFD_EVENT_DISCONNECT; - } - ReceiveActivity( FCB, NULL ); PollReeval( FCB->DeviceExt, FCB->FileObject ); @@ -249,7 +247,7 @@ AFD_DbgPrint(MID_TRACE,("Returned %x\n", Status)); - return Status; + return STATUS_SUCCESS; } NTSTATUS STDCALL @@ -260,7 +258,7 @@ PAFD_FCB FCB = FileObject->FsContext; PAFD_RECV_INFO RecvReq; UINT TotalBytesCopied = 0; - + AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp, FALSE ); @@ -294,6 +292,11 @@ NULL, NULL, TRUE, FALSE ); + if( !RecvReq->BufferArray ) { + return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, + Irp, 0, NULL, FALSE ); + } + Irp->IoStatus.Status = STATUS_PENDING; Irp->IoStatus.Information = 0;
19 years, 8 months
2
1
0
0
[royce] 14546: use tags for pool allocations, and reformat code
by royce@svn.reactos.com
use tags for pool allocations, and reformat code Modified: trunk/reactos/ntoskrnl/ps/create.c _____ Modified: trunk/reactos/ntoskrnl/ps/create.c --- trunk/reactos/ntoskrnl/ps/create.c 2005-04-08 12:54:37 UTC (rev 14545) +++ trunk/reactos/ntoskrnl/ps/create.c 2005-04-08 13:02:23 UTC (rev 14546) @@ -4,7 +4,7 @@ * PROJECT: ReactOS kernel * FILE: ntoskrnl/ps/create.c * PURPOSE: Thread managment - * + * * PROGRAMMERS: David Welch (welch(a)mcmail.com) * Phillip Susi * Skywing @@ -12,10 +12,10 @@ /* * NOTE: - * + * * All of the routines that manipulate the thread queue synchronize on * a single spinlock - * + * */ /* INCLUDES ****************************************************************/ @@ -27,6 +27,7 @@ /* GLOBAL *******************************************************************/ #define MAX_THREAD_NOTIFY_ROUTINE_COUNT 8 +#define TAG_KAPC TAG('k','p','a','p') /* kpap - kernel ps apc */ static ULONG PiThreadNotifyRoutineCount = 0; static PCREATE_THREAD_NOTIFY_ROUTINE @@ -40,462 +41,475 @@ VOID PiBeforeBeginThread(CONTEXT c) { - KeLowerIrql(PASSIVE_LEVEL); + KeLowerIrql(PASSIVE_LEVEL); } NTSTATUS -PsInitializeThread(PEPROCESS Process, - PETHREAD* ThreadPtr, - POBJECT_ATTRIBUTES ObjectAttributes, - KPROCESSOR_MODE AccessMode, - BOOLEAN First) +PsInitializeThread ( + PEPROCESS Process, + PETHREAD* ThreadPtr, + POBJECT_ATTRIBUTES ObjectAttributes, + KPROCESSOR_MODE AccessMode, + BOOLEAN First ) { - PETHREAD Thread; - NTSTATUS Status; - KIRQL oldIrql; - - PAGED_CODE(); - - if (Process == NULL) - { - Process = PsInitialSystemProcess; - } - - /* + PETHREAD Thread; + NTSTATUS Status; + KIRQL oldIrql; + + PAGED_CODE(); + + if (Process == NULL) + { + Process = PsInitialSystemProcess; + } + + /* * Create and initialize thread */ - Status = ObCreateObject(AccessMode, - PsThreadType, - ObjectAttributes, - KernelMode, - NULL, - sizeof(ETHREAD), - 0, - 0, - (PVOID*)&Thread); - if (!NT_SUCCESS(Status)) - { + Status = ObCreateObject(AccessMode, + PsThreadType, + ObjectAttributes, + KernelMode, + NULL, + sizeof(ETHREAD), + 0, + 0, + (PVOID*)&Thread); + if (!NT_SUCCESS(Status)) + { return(Status); - } + } - /* + /* * Reference process */ - ObReferenceObjectByPointer(Process, - PROCESS_CREATE_THREAD, - PsProcessType, - KernelMode); + ObReferenceObjectByPointer(Process, + PROCESS_CREATE_THREAD, + PsProcessType, + KernelMode); - Thread->ThreadsProcess = Process; - Thread->Cid.UniqueThread = NULL; - Thread->Cid.UniqueProcess = (HANDLE)Thread->ThreadsProcess->UniqueProcessId; + Thread->ThreadsProcess = Process; + Thread->Cid.UniqueThread = NULL; + Thread->Cid.UniqueProcess = (HANDLE)Thread->ThreadsProcess->UniqueProcessId; - DPRINT("Thread = %x\n",Thread); + DPRINT("Thread = %x\n",Thread); - KeInitializeThread(&Process->Pcb, &Thread->Tcb, First); - InitializeListHead(&Thread->ActiveTimerListHead); - KeInitializeSpinLock(&Thread->ActiveTimerListLock); - InitializeListHead(&Thread->IrpList); - Thread->DeadThread = FALSE; - Thread->HasTerminated = FALSE; - Thread->Tcb.Win32Thread = NULL; - DPRINT("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread); - + KeInitializeThread(&Process->Pcb, &Thread->Tcb, First); + InitializeListHead(&Thread->ActiveTimerListHead); + KeInitializeSpinLock(&Thread->ActiveTimerListLock); + InitializeListHead(&Thread->IrpList); + Thread->DeadThread = FALSE; + Thread->HasTerminated = FALSE; + Thread->Tcb.Win32Thread = NULL; + DPRINT("Thread->Cid.UniqueThread %d\n",Thread->Cid.UniqueThread); - Thread->Tcb.BasePriority = (CHAR)Process->Pcb.BasePriority; - Thread->Tcb.Priority = Thread->Tcb.BasePriority; - /* + Thread->Tcb.BasePriority = (CHAR)Process->Pcb.BasePriority; + Thread->Tcb.Priority = Thread->Tcb.BasePriority; + + /* * Local Procedure Call facility (LPC) */ - KeInitializeSemaphore (& Thread->LpcReplySemaphore, 0, LONG_MAX); - Thread->LpcReplyMessage = NULL; - Thread->LpcReplyMessageId = 0; /* not valid */ - /* Thread->LpcReceiveMessageId = 0; */ - Thread->LpcExitThreadCalled = FALSE; - Thread->LpcReceivedMsgIdValid = FALSE; + KeInitializeSemaphore (& Thread->LpcReplySemaphore, 0, LONG_MAX); + Thread->LpcReplyMessage = NULL; + Thread->LpcReplyMessageId = 0; /* not valid */ + /* Thread->LpcReceiveMessageId = 0; */ + Thread->LpcExitThreadCalled = FALSE; + Thread->LpcReceivedMsgIdValid = FALSE; - oldIrql = KeAcquireDispatcherDatabaseLock(); - InsertTailList(&Process->ThreadListHead, - &Thread->ThreadListEntry); - KeReleaseDispatcherDatabaseLock(oldIrql); + oldIrql = KeAcquireDispatcherDatabaseLock(); + InsertTailList(&Process->ThreadListHead, + &Thread->ThreadListEntry); + KeReleaseDispatcherDatabaseLock(oldIrql); - *ThreadPtr = Thread; + *ThreadPtr = Thread; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } static NTSTATUS -PsCreateTeb(HANDLE ProcessHandle, - PTEB *TebPtr, - PETHREAD Thread, - PINITIAL_TEB InitialTeb) +PsCreateTeb ( + HANDLE ProcessHandle, + PTEB *TebPtr, + PETHREAD Thread, + PINITIAL_TEB InitialTeb ) { - PEPROCESS Process; - NTSTATUS Status; - ULONG ByteCount; - ULONG RegionSize; - ULONG TebSize; - PVOID TebBase; - TEB Teb; - - PAGED_CODE(); + PEPROCESS Process; + NTSTATUS Status; + ULONG ByteCount; + ULONG RegionSize; + ULONG TebSize; + PVOID TebBase; + TEB Teb; - TebSize = PAGE_SIZE; + PAGED_CODE(); - if (NULL == Thread->ThreadsProcess) - { - /* We'll be allocating a 64k block here and only use 4k of it, but this - path should almost never be taken. Actually, I never saw it was taken, - so maybe we should just ASSERT(NULL != Thread->ThreadsProcess) and - move on */ - TebBase = NULL; - Status = ZwAllocateVirtualMemory(ProcessHandle, - &TebBase, - 0, - &TebSize, - MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, - PAGE_READWRITE); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to allocate virtual memory for TEB\n"); - return Status; - } - } - else - { - Process = Thread->ThreadsProcess; - PsLockProcess(Process, FALSE); - if (NULL == Process->TebBlock || - Process->TebBlock == Process->TebLastAllocated) - { - Process->TebBlock = NULL; - RegionSize = MM_VIRTMEM_GRANULARITY; - Status = ZwAllocateVirtualMemory(ProcessHandle, - &Process->TebBlock, - 0, - &RegionSize, - MEM_RESERVE | MEM_TOP_DOWN, - PAGE_READWRITE); - if (! NT_SUCCESS(Status)) - { - PsUnlockProcess(Process); - DPRINT1("Failed to reserve virtual memory for TEB\n"); - return Status; - } - Process->TebLastAllocated = (PVOID) ((char *) Process->TebBlock + RegionSize); - } - TebBase = (PVOID) ((char *) Process->TebLastAllocated - PAGE_SIZE); - Status = ZwAllocateVirtualMemory(ProcessHandle, - &TebBase, - 0, - &TebSize, - MEM_COMMIT, - PAGE_READWRITE); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to commit virtual memory for TEB\n"); - return Status; - } - Process->TebLastAllocated = TebBase; - PsUnlockProcess(Process); - } + TebSize = PAGE_SIZE; - DPRINT ("TebBase %p TebSize %lu\n", TebBase, TebSize); - ASSERT(NULL != TebBase && PAGE_SIZE <= TebSize); - - RtlZeroMemory(&Teb, sizeof(TEB)); - /* set all pointers to and from the TEB */ - Teb.Tib.Self = TebBase; - if (Thread->ThreadsProcess) - { - Teb.Peb = Thread->ThreadsProcess->Peb; /* No PEB yet!! */ - } - DPRINT("Teb.Peb %x\n", Teb.Peb); - - /* store stack information from InitialTeb */ - if(InitialTeb != NULL) - { - /* fixed-size stack */ - if(InitialTeb->StackBase && InitialTeb->StackLimit) + if (NULL == Thread->ThreadsProcess) { - Teb.Tib.StackBase = InitialTeb->StackBase; - Teb.Tib.StackLimit = InitialTeb->StackLimit; - Teb.DeallocationStack = InitialTeb->StackLimit; + /* We'll be allocating a 64k block here and only use 4k of it, but this + path should almost never be taken. Actually, I never saw it was taken, + so maybe we should just ASSERT(NULL != Thread->ThreadsProcess) and + move on */ + TebBase = NULL; + Status = ZwAllocateVirtualMemory(ProcessHandle, + &TebBase, + 0, + &TebSize, + MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN, + PAGE_READWRITE); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to allocate virtual memory for TEB\n"); + return Status; + } } - /* expandable stack */ else { - Teb.Tib.StackBase = InitialTeb->StackCommit; - Teb.Tib.StackLimit = InitialTeb->StackCommitMax; - Teb.DeallocationStack = InitialTeb->StackReserved; + Process = Thread->ThreadsProcess; + PsLockProcess(Process, FALSE); + if (NULL == Process->TebBlock || + Process->TebBlock == Process->TebLastAllocated) + { + Process->TebBlock = NULL; + RegionSize = MM_VIRTMEM_GRANULARITY; + Status = ZwAllocateVirtualMemory(ProcessHandle, + &Process->TebBlock, + 0, + &RegionSize, + MEM_RESERVE | MEM_TOP_DOWN, + PAGE_READWRITE); + if (! NT_SUCCESS(Status)) + { + PsUnlockProcess(Process); + DPRINT1("Failed to reserve virtual memory for TEB\n"); + return Status; + } + Process->TebLastAllocated = (PVOID) ((char *) Process->TebBlock + RegionSize); + } + TebBase = (PVOID) ((char *) Process->TebLastAllocated - PAGE_SIZE); + Status = ZwAllocateVirtualMemory(ProcessHandle, + &TebBase, + 0, + &TebSize, + MEM_COMMIT, + PAGE_READWRITE); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to commit virtual memory for TEB\n"); + return Status; + } + Process->TebLastAllocated = TebBase; + PsUnlockProcess(Process); } - } - /* more initialization */ - Teb.Cid.UniqueThread = Thread->Cid.UniqueThread; - Teb.Cid.UniqueProcess = Thread->Cid.UniqueProcess; - Teb.CurrentLocale = PsDefaultThreadLocaleId; + DPRINT ("TebBase %p TebSize %lu\n", TebBase, TebSize); + ASSERT(NULL != TebBase && PAGE_SIZE <= TebSize); - /* Terminate the exception handler list */ - Teb.Tib.ExceptionList = (PVOID)-1; - - DPRINT("sizeof(TEB) %x\n", sizeof(TEB)); - - /* write TEB data into teb page */ - Status = NtWriteVirtualMemory(ProcessHandle, - TebBase, - &Teb, - sizeof(TEB), - &ByteCount); + RtlZeroMemory(&Teb, sizeof(TEB)); + /* set all pointers to and from the TEB */ + Teb.Tib.Self = TebBase; + if (Thread->ThreadsProcess) + { + Teb.Peb = Thread->ThreadsProcess->Peb; /* No PEB yet!! */ + } + DPRINT("Teb.Peb %x\n", Teb.Peb); - if (!NT_SUCCESS(Status)) - { + /* store stack information from InitialTeb */ + if(InitialTeb != NULL) + { + /* fixed-size stack */ + if(InitialTeb->StackBase && InitialTeb->StackLimit) + { + Teb.Tib.StackBase = InitialTeb->StackBase; + Teb.Tib.StackLimit = InitialTeb->StackLimit; + Teb.DeallocationStack = InitialTeb->StackLimit; + } + /* expandable stack */ + else + { + Teb.Tib.StackBase = InitialTeb->StackCommit; + Teb.Tib.StackLimit = InitialTeb->StackCommitMax; + Teb.DeallocationStack = InitialTeb->StackReserved; + } + } + + /* more initialization */ + Teb.Cid.UniqueThread = Thread->Cid.UniqueThread; + Teb.Cid.UniqueProcess = Thread->Cid.UniqueProcess; + Teb.CurrentLocale = PsDefaultThreadLocaleId; + + /* Terminate the exception handler list */ + Teb.Tib.ExceptionList = (PVOID)-1; + + DPRINT("sizeof(TEB) %x\n", sizeof(TEB)); + + /* write TEB data into teb page */ + Status = NtWriteVirtualMemory(ProcessHandle, + TebBase, + &Teb, + sizeof(TEB), + &ByteCount); + + if (!NT_SUCCESS(Status)) + { /* free TEB */ DPRINT1 ("Writing TEB failed!\n"); RegionSize = 0; NtFreeVirtualMemory(ProcessHandle, - TebBase, - &RegionSize, - MEM_RELEASE); + TebBase, + &RegionSize, + MEM_RELEASE); return Status; - } + } - if (TebPtr != NULL) - { + if (TebPtr != NULL) + { *TebPtr = (PTEB)TebBase; - } + } - DPRINT("TEB allocated at %p\n", TebBase); + DPRINT("TEB allocated at %p\n", TebBase); - return Status; + return Status; } VOID STDCALL -LdrInitApcRundownRoutine(PKAPC Apc) +LdrInitApcRundownRoutine ( PKAPC Apc ) { - ExFreePool(Apc); + ExFreePool(Apc); } VOID STDCALL -LdrInitApcKernelRoutine(PKAPC Apc, - PKNORMAL_ROUTINE* NormalRoutine, - PVOID* NormalContext, - PVOID* SystemArgument1, - PVOID* SystemArgument2) +LdrInitApcKernelRoutine ( + PKAPC Apc, + PKNORMAL_ROUTINE* NormalRoutine, + PVOID* NormalContext, + PVOID* SystemArgument1, + PVOID* SystemArgument2) { - ExFreePool(Apc); + ExFreePool(Apc); } NTSTATUS STDCALL -NtCreateThread(OUT PHANDLE ThreadHandle, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, - IN HANDLE ProcessHandle, - OUT PCLIENT_ID ClientId, - IN PCONTEXT ThreadContext, - IN PINITIAL_TEB InitialTeb, - IN BOOLEAN CreateSuspended) +NtCreateThread ( + OUT PHANDLE ThreadHandle, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN HANDLE ProcessHandle, + OUT PCLIENT_ID ClientId, + IN PCONTEXT ThreadContext, + IN PINITIAL_TEB InitialTeb, + IN BOOLEAN CreateSuspended ) { - HANDLE hThread; - CONTEXT SafeContext; - INITIAL_TEB SafeInitialTeb; - PEPROCESS Process; - PETHREAD Thread; - PTEB TebBase; - PKAPC LdrInitApc; - KIRQL oldIrql; - KPROCESSOR_MODE PreviousMode; - NTSTATUS Status = STATUS_SUCCESS; - - PAGED_CODE(); - - if(ThreadContext == NULL) - { - return STATUS_INVALID_PARAMETER; - } - - PreviousMode = ExGetPreviousMode(); + HANDLE hThread; + CONTEXT SafeContext; + INITIAL_TEB SafeInitialTeb; + PEPROCESS Process; + PETHREAD Thread; + PTEB TebBase; + PKAPC LdrInitApc; + KIRQL oldIrql; + KPROCESSOR_MODE PreviousMode; + NTSTATUS Status = STATUS_SUCCESS; - if(PreviousMode != KernelMode) - { - _SEH_TRY + PAGED_CODE(); + + if(ThreadContext == NULL) { - ProbeForWrite(ThreadHandle, - sizeof(HANDLE), - sizeof(ULONG)); - if(ClientId != NULL) - { - ProbeForWrite(ClientId, - sizeof(CLIENT_ID), - sizeof(ULONG)); - } - ProbeForRead(ThreadContext, - sizeof(CONTEXT), - sizeof(ULONG)); - SafeContext = *ThreadContext; - ThreadContext = &SafeContext; - ProbeForRead(InitialTeb, - sizeof(INITIAL_TEB), - sizeof(ULONG)); - SafeInitialTeb = *InitialTeb; - InitialTeb = &SafeInitialTeb; + return STATUS_INVALID_PARAMETER; } - _SEH_HANDLE + + PreviousMode = ExGetPreviousMode(); + + if(PreviousMode != KernelMode) { - Status = _SEH_GetExceptionCode(); + _SEH_TRY + { + ProbeForWrite(ThreadHandle, + sizeof(HANDLE), + sizeof(ULONG)); + if(ClientId != NULL) + { + ProbeForWrite(ClientId, + sizeof(CLIENT_ID), + sizeof(ULONG)); + } + ProbeForRead(ThreadContext, + sizeof(CONTEXT), + sizeof(ULONG)); + SafeContext = *ThreadContext; + ThreadContext = &SafeContext; + ProbeForRead(InitialTeb, + sizeof(INITIAL_TEB), + sizeof(ULONG)); + SafeInitialTeb = *InitialTeb; + InitialTeb = &SafeInitialTeb; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + + if(!NT_SUCCESS(Status)) + { + return Status; + } } - _SEH_END; + DPRINT("NtCreateThread(ThreadHandle %x, PCONTEXT %x)\n", + ThreadHandle,ThreadContext); + + Status = ObReferenceObjectByHandle( + ProcessHandle, + PROCESS_CREATE_THREAD, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); if(!NT_SUCCESS(Status)) { - return Status; + return(Status); } - } - DPRINT("NtCreateThread(ThreadHandle %x, PCONTEXT %x)\n", - ThreadHandle,ThreadContext); - - Status = ObReferenceObjectByHandle(ProcessHandle, - PROCESS_CREATE_THREAD, - PsProcessType, - PreviousMode, - (PVOID*)&Process, - NULL); - if(!NT_SUCCESS(Status)) - { - return(Status); - } - - Status = PsLockProcess(Process, FALSE); - if (!NT_SUCCESS(Status)) + Status = PsLockProcess(Process, FALSE); + if (!NT_SUCCESS(Status)) { - ObDereferenceObject(Process); - return(Status); + ObDereferenceObject(Process); + return(Status); } - if(Process->ExitTime.QuadPart != 0) + if(Process->ExitTime.QuadPart != 0) { - PsUnlockProcess(Process); - return STATUS_PROCESS_IS_TERMINATING; + PsUnlockProcess(Process); + return STATUS_PROCESS_IS_TERMINATING; } - PsUnlockProcess(Process); + PsUnlockProcess(Process); - Status = PsInitializeThread(Process, - &Thread, - ObjectAttributes, - PreviousMode, - FALSE); + Status = PsInitializeThread(Process, + &Thread, + ObjectAttributes, + PreviousMode, + FALSE); - ObDereferenceObject(Process); - - if (!NT_SUCCESS(Status)) + ObDereferenceObject(Process); + + if (!NT_SUCCESS(Status)) { - return(Status); + return(Status); } - - /* create a client id handle */ - Status = PsCreateCidHandle(Thread, PsThreadType, &Thread->Cid.UniqueThread); - if (!NT_SUCCESS(Status)) + + /* create a client id handle */ + Status = PsCreateCidHandle ( + Thread, PsThreadType, &Thread->Cid.UniqueThread); + if (!NT_SUCCESS(Status)) { - ObDereferenceObject(Thread); - return Status; + ObDereferenceObject(Thread); + return Status; } - Status = KiArchInitThreadWithContext(&Thread->Tcb, ThreadContext); - if (!NT_SUCCESS(Status)) + Status = KiArchInitThreadWithContext(&Thread->Tcb, ThreadContext); + if (!NT_SUCCESS(Status)) { - PsDeleteCidHandle(Thread->Cid.UniqueThread, PsThreadType); - ObDereferenceObject(Thread); - return(Status); + PsDeleteCidHandle(Thread->Cid.UniqueThread, PsThreadType); + ObDereferenceObject(Thread); + return(Status); } - Status = PsCreateTeb(ProcessHandle, - &TebBase, - Thread, - InitialTeb); - if (!NT_SUCCESS(Status)) + Status = PsCreateTeb(ProcessHandle, + &TebBase, + Thread, + InitialTeb); + if (!NT_SUCCESS(Status)) { - PsDeleteCidHandle(Thread->Cid.UniqueThread, PsThreadType); - ObDereferenceObject(Thread); - return(Status); + PsDeleteCidHandle(Thread->Cid.UniqueThread, PsThreadType); + ObDereferenceObject(Thread); + return(Status); } - Thread->Tcb.Teb = TebBase; + Thread->Tcb.Teb = TebBase; - Thread->StartAddress = NULL; + Thread->StartAddress = NULL; - /* - * Maybe send a message to the process's debugger - */ - DbgkCreateThread((PVOID)ThreadContext->Eip); + /* + * Maybe send a message to the process's debugger + */ + DbgkCreateThread((PVOID)ThreadContext->Eip); - /* - * First, force the thread to be non-alertable for user-mode alerts. - */ - Thread->Tcb.Alertable = FALSE; + /* + * First, force the thread to be non-alertable for user-mode alerts. + */ + Thread->Tcb.Alertable = FALSE; - /* - * If the thread is to be created suspended then queue an APC to - * do the suspend before we run any userspace code. - */ - if (CreateSuspended) + /* + * If the thread is to be created suspended then queue an APC to + * do the suspend before we run any userspace code. + */ + if (CreateSuspended) { - KeSuspendThread(&Thread->Tcb); + KeSuspendThread(&Thread->Tcb); } - /* - * Queue an APC to the thread that will execute the ntdll startup - * routine. - */ - LdrInitApc = ExAllocatePool(NonPagedPool, sizeof(KAPC)); - KeInitializeApc(LdrInitApc, &Thread->Tcb, OriginalApcEnvironment, LdrInitApcKernelRoutine, - LdrInitApcRundownRoutine, LdrpGetSystemDllEntryPoint(), - UserMode, NULL); - KeInsertQueueApc(LdrInitApc, NULL, NULL, IO_NO_INCREMENT); - - /* - * The thread is non-alertable, so the APC we added did not set UserApcPending to TRUE. - * We must do this manually. Do NOT attempt to set the Thread to Alertable before the call, - * doing so is a blatant and erronous hack. - */ - Thread->Tcb.ApcState.UserApcPending = TRUE; - Thread->Tcb.Alerted[KernelMode] = TRUE; + /* + * Queue an APC to the thread that will execute the ntdll startup + * routine. + */ + LdrInitApc = ExAllocatePoolWithTag ( + NonPagedPool, sizeof(KAPC), TAG_KAPC ); + KeInitializeApc ( + LdrInitApc, + &Thread->Tcb, + OriginalApcEnvironment, + LdrInitApcKernelRoutine, + LdrInitApcRundownRoutine, + LdrpGetSystemDllEntryPoint(), + UserMode, + NULL ); + KeInsertQueueApc(LdrInitApc, NULL, NULL, IO_NO_INCREMENT); - oldIrql = KeAcquireDispatcherDatabaseLock (); - KiUnblockThread(&Thread->Tcb, NULL, 0); - KeReleaseDispatcherDatabaseLock(oldIrql); + /* + * The thread is non-alertable, so the APC we added did not set UserApcPending to TRUE. + * We must do this manually. Do NOT attempt to set the Thread to Alertable before the call, + * doing so is a blatant and erronous hack. + */ + Thread->Tcb.ApcState.UserApcPending = TRUE; + Thread->Tcb.Alerted[KernelMode] = TRUE; - Status = ObInsertObject((PVOID)Thread, - NULL, - DesiredAccess, - 0, - NULL, - &hThread); - if(NT_SUCCESS(Status)) - { - _SEH_TRY + oldIrql = KeAcquireDispatcherDatabaseLock (); + KiUnblockThread(&Thread->Tcb, NULL, 0); + KeReleaseDispatcherDatabaseLock(oldIrql); + + Status = ObInsertObject((PVOID)Thread, + NULL, + DesiredAccess, + 0, + NULL, + &hThread); + if(NT_SUCCESS(Status)) { - if(ClientId != NULL) - { - *ClientId = Thread->Cid; - } - *ThreadHandle = hThread; + _SEH_TRY + { + if(ClientId != NULL) + { + *ClientId = Thread->Cid; + } + *ThreadHandle = hThread; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; } - _SEH_HANDLE - { - Status = _SEH_GetExceptionCode(); - } - _SEH_END; - } - - return Status; + + return Status; } @@ -503,17 +517,18 @@ * @implemented */ NTSTATUS STDCALL -PsCreateSystemThread(PHANDLE ThreadHandle, - ACCESS_MASK DesiredAccess, - POBJECT_ATTRIBUTES ObjectAttributes, - HANDLE ProcessHandle, - PCLIENT_ID ClientId, - PKSTART_ROUTINE StartRoutine, - PVOID StartContext) +PsCreateSystemThread ( + PHANDLE ThreadHandle, + ACCESS_MASK DesiredAccess, + POBJECT_ATTRIBUTES ObjectAttributes, + HANDLE ProcessHandle, + PCLIENT_ID ClientId, + PKSTART_ROUTINE StartRoutine, + PVOID StartContext ) /* * FUNCTION: Creates a thread which executes in kernel mode * ARGUMENTS: - * ThreadHandle (OUT) = Caller supplied storage for the returned thread + * ThreadHandle (OUT) = Caller supplied storage for the returned thread * handle * DesiredAccess = Requested access to the thread * ObjectAttributes = Object attributes (optional) @@ -527,78 +542,82 @@ * RETURNS: Success or failure status */ { - PETHREAD Thread; - NTSTATUS Status; - KIRQL oldIrql; - - PAGED_CODE(); - - DPRINT("PsCreateSystemThread(ThreadHandle %x, ProcessHandle %x)\n", - ThreadHandle,ProcessHandle); - - Status = PsInitializeThread(NULL, - &Thread, - ObjectAttributes, - KernelMode, - FALSE); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + PETHREAD Thread; + NTSTATUS Status; + KIRQL oldIrql; + PAGED_CODE(); + + DPRINT("PsCreateSystemThread(ThreadHandle %x, ProcessHandle %x)\n", + ThreadHandle,ProcessHandle); + + Status = PsInitializeThread( + NULL, + &Thread, + ObjectAttributes, + KernelMode, + FALSE); + if (!NT_SUCCESS(Status)) + { + return(Status); + } + /* Set the thread as a system thread */ Thread->SystemThread = TRUE; - - Status = PsCreateCidHandle(Thread, - PsThreadType, - &Thread->Cid.UniqueThread); - if(!NT_SUCCESS(Status)) - { - ObDereferenceObject(Thread); - return Status; - } - - Thread->StartAddress = StartRoutine; - Status = KiArchInitThread(&Thread->Tcb, StartRoutine, StartContext); - if (!NT_SUCCESS(Status)) - { + + Status = PsCreateCidHandle(Thread, + PsThreadType, + &Thread->Cid.UniqueThread); + if(!NT_SUCCESS(Status)) + { ObDereferenceObject(Thread); + return Status; + } + + Thread->StartAddress = StartRoutine; + Status = KiArchInitThread ( + &Thread->Tcb, StartRoutine, StartContext); + if (!NT_SUCCESS(Status)) + { + ObDereferenceObject(Thread); return(Status); - } + } - if (ClientId != NULL) - { - *ClientId=Thread->Cid; - } + if (ClientId != NULL) + { + *ClientId=Thread->Cid; + } - oldIrql = KeAcquireDispatcherDatabaseLock (); - KiUnblockThread(&Thread->Tcb, NULL, 0); - KeReleaseDispatcherDatabaseLock(oldIrql); - - Status = ObInsertObject((PVOID)Thread, - NULL, - DesiredAccess, - 0, - NULL, - ThreadHandle); - - /* don't dereference the thread, the initial reference serves as the keep-alive - reference which will be removed by the thread reaper */ - - return Status; + oldIrql = KeAcquireDispatcherDatabaseLock (); + KiUnblockThread(&Thread->Tcb, NULL, 0); + KeReleaseDispatcherDatabaseLock(oldIrql); + + Status = ObInsertObject( + (PVOID)Thread, [truncated at 1000 lines; 58 more skipped]
19 years, 8 months
1
0
0
0
[royce] 14545: use tags for pool allocations, and reformat code
by royce@svn.reactos.com
use tags for pool allocations, and reformat code Modified: trunk/reactos/ntoskrnl/ldr/loader.c _____ Modified: trunk/reactos/ntoskrnl/ldr/loader.c --- trunk/reactos/ntoskrnl/ldr/loader.c 2005-04-08 11:08:26 UTC (rev 14544) +++ trunk/reactos/ntoskrnl/ldr/loader.c 2005-04-08 12:54:37 UTC (rev 14545) @@ -1,5 +1,5 @@ /* $Id$ - * + * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel * FILE: ntoskrnl/ldr/loader.c @@ -41,10 +41,13 @@ STATIC MODULE_TEXT_SECTION LdrHalTextSection; ULONG_PTR LdrHalBase; -#define TAG_DRIVER_MEM TAG('D', 'R', 'V', 'M') +#define TAG_DRIVER_MEM TAG('D', 'R', 'V', 'M') /* drvm */ +#define TAG_MODULE_OBJECT TAG('k', 'l', 'm', 'o') /* klmo - kernel ldr module object */ +#define TAG_LDR_WSTR TAG('k', 'l', 'w', 's') /* klws - kernel ldr wide string */ +#define TAG_MODULE_TEXT_SECTION TAG('k', 'l', 'm', 't') /* klmt - kernel ldr module text */ #ifndef HIWORD -#define HIWORD(X) ((WORD) (((DWORD) (X) >> 16) & 0xFFFF)) +#define HIWORD(X) ((WORD) (((DWORD) (X) >> 16) & 0xFFFF)) #endif #ifndef LOWORD #define LOWORD(X) ((WORD) (X)) @@ -53,1554 +56,1583 @@ /* FORWARD DECLARATIONS ******************************************************/ NTSTATUS -LdrProcessModule(PVOID ModuleLoadBase, - PUNICODE_STRING ModuleName, - PMODULE_OBJECT *ModuleObject); +LdrProcessModule ( + PVOID ModuleLoadBase, + PUNICODE_STRING ModuleName, + PMODULE_OBJECT *ModuleObject ); static VOID -LdrpBuildModuleBaseName(PUNICODE_STRING BaseName, - PUNICODE_STRING FullName); +LdrpBuildModuleBaseName ( + PUNICODE_STRING BaseName, + PUNICODE_STRING FullName ); static LONG -LdrpCompareModuleNames(IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2); +LdrpCompareModuleNames ( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2 ); /* PE Driver load support */ -static NTSTATUS LdrPEProcessModule(PVOID ModuleLoadBase, - PUNICODE_STRING FileName, - PMODULE_OBJECT *ModuleObject); +static NTSTATUS +LdrPEProcessModule ( + PVOID ModuleLoadBase, + PUNICODE_STRING FileName, + PMODULE_OBJECT *ModuleObject ); + static PVOID -LdrPEGetExportByName(PVOID BaseAddress, - PUCHAR SymbolName, - WORD Hint); +LdrPEGetExportByName ( + PVOID BaseAddress, + PUCHAR SymbolName, + WORD Hint ); static PVOID -LdrPEFixupForward(PCHAR ForwardName); +LdrPEFixupForward ( PCHAR ForwardName ); static NTSTATUS -LdrPEPerformRelocations(PVOID DriverBase, - ULONG DriverSize); +LdrPEPerformRelocations ( + PVOID DriverBase, + ULONG DriverSize ); static NTSTATUS -LdrPEFixupImports(PMODULE_OBJECT Module); +LdrPEFixupImports ( PMODULE_OBJECT Module ); /* FUNCTIONS *****************************************************************/ VOID -LdrInitDebug(PLOADER_MODULE Module, PWCH Name) +LdrInitDebug ( PLOADER_MODULE Module, PWCH Name ) { - PLIST_ENTRY current_entry; - MODULE_TEXT_SECTION* current; + PLIST_ENTRY current_entry; + MODULE_TEXT_SECTION* current; - current_entry = ModuleTextListHead.Flink; - while (current_entry != &ModuleTextListHead) + current_entry = ModuleTextListHead.Flink; + while (current_entry != &ModuleTextListHead) { - current = - CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION, ListEntry); - if (wcscmp(current->Name, Name) == 0) - { - break; - } - current_entry = current_entry->Flink; + current = + CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION, ListEntry); + if (wcscmp(current->Name, Name) == 0) + { + break; + } + current_entry = current_entry->Flink; } - if (current_entry == &ModuleTextListHead) + if (current_entry == &ModuleTextListHead) { - return; + return; } } VOID INIT_FUNCTION -LdrInit1(VOID) +LdrInit1 ( VOID ) { - PIMAGE_NT_HEADERS NtHeader; - PIMAGE_SECTION_HEADER SectionList; + PIMAGE_NT_HEADERS NtHeader; + PIMAGE_SECTION_HEADER SectionList; - InitializeListHead(&ModuleTextListHead); + InitializeListHead(&ModuleTextListHead); - /* Setup ntoskrnl.exe text section */ - /* - * This isn't the base of the text segment, but the start of the - * full image (in memory) - * Also, the Length field isn't set to the length of the segment, - * but is more like the offset, from the image base, to the end - * of the segment. - */ - NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE); - SectionList = IMAGE_FIRST_SECTION(NtHeader); - NtoskrnlTextSection.Base = KERNEL_BASE; - NtoskrnlTextSection.Length = SectionList[0].Misc.VirtualSize + - SectionList[0].VirtualAddress; - NtoskrnlTextSection.Name = KERNEL_MODULE_NAME; - NtoskrnlTextSection.OptionalHeader = OPTHDROFFSET(KERNEL_BASE); - InsertTailList(&ModuleTextListHead, &NtoskrnlTextSection.ListEntry); + /* Setup ntoskrnl.exe text section */ + /* + * This isn't the base of the text segment, but the start of the + * full image (in memory) + * Also, the Length field isn't set to the length of the segment, + * but is more like the offset, from the image base, to the end + * of the segment. + */ + NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE); + SectionList = IMAGE_FIRST_SECTION(NtHeader); + NtoskrnlTextSection.Base = KERNEL_BASE; + NtoskrnlTextSection.Length = SectionList[0].Misc.VirtualSize + + SectionList[0].VirtualAddress; + NtoskrnlTextSection.Name = KERNEL_MODULE_NAME; + NtoskrnlTextSection.OptionalHeader = OPTHDROFFSET(KERNEL_BASE); + InsertTailList(&ModuleTextListHead, &NtoskrnlTextSection.ListEntry); - /* Setup hal.dll text section */ - /* Same comment as above applies */ - NtHeader = RtlImageNtHeader((PVOID)LdrHalBase); - SectionList = IMAGE_FIRST_SECTION(NtHeader); - LdrHalTextSection.Base = LdrHalBase; - LdrHalTextSection.Length = SectionList[0].Misc.VirtualSize + - SectionList[0].VirtualAddress; - LdrHalTextSection.Name = HAL_MODULE_NAME; - LdrHalTextSection.OptionalHeader = OPTHDROFFSET(LdrHalBase); - InsertTailList(&ModuleTextListHead, &LdrHalTextSection.ListEntry); + /* Setup hal.dll text section */ + /* Same comment as above applies */ + NtHeader = RtlImageNtHeader((PVOID)LdrHalBase); + SectionList = IMAGE_FIRST_SECTION(NtHeader); + LdrHalTextSection.Base = LdrHalBase; + LdrHalTextSection.Length = SectionList[0].Misc.VirtualSize + + SectionList[0].VirtualAddress; + LdrHalTextSection.Name = HAL_MODULE_NAME; + LdrHalTextSection.OptionalHeader = OPTHDROFFSET(LdrHalBase); + InsertTailList(&ModuleTextListHead, &LdrHalTextSection.ListEntry); - /* Hook for KDB on initialization of the loader. */ - KDB_LOADERINIT_HOOK(&NtoskrnlTextSection, &LdrHalTextSection); + /* Hook for KDB on initialization of the loader. */ + KDB_LOADERINIT_HOOK(&NtoskrnlTextSection, &LdrHalTextSection); } VOID INIT_FUNCTION -LdrInitModuleManagement(VOID) +LdrInitModuleManagement ( VOID ) { - PIMAGE_NT_HEADERS NtHeader; + PIMAGE_NT_HEADERS NtHeader; - /* Initialize the module list and spinlock */ - InitializeListHead(&ModuleListHead); - KeInitializeSpinLock(&ModuleListLock); + /* Initialize the module list and spinlock */ + InitializeListHead(&ModuleListHead); + KeInitializeSpinLock(&ModuleListLock); - /* Initialize ModuleObject for NTOSKRNL */ - RtlZeroMemory(&NtoskrnlModuleObject, sizeof(MODULE_OBJECT)); - NtoskrnlModuleObject.Base = (PVOID) KERNEL_BASE; - NtoskrnlModuleObject.Flags = MODULE_FLAG_PE; - RtlInitUnicodeString(&NtoskrnlModuleObject.FullName, KERNEL_MODULE_NAME); - LdrpBuildModuleBaseName(&NtoskrnlModuleObject.BaseName, &NtoskrnlModuleObject.FullName); + /* Initialize ModuleObject for NTOSKRNL */ + RtlZeroMemory(&NtoskrnlModuleObject, sizeof(MODULE_OBJECT)); + NtoskrnlModuleObject.Base = (PVOID) KERNEL_BASE; + NtoskrnlModuleObject.Flags = MODULE_FLAG_PE; + RtlInitUnicodeString(&NtoskrnlModuleObject.FullName, KERNEL_MODULE_NAME); + LdrpBuildModuleBaseName(&NtoskrnlModuleObject.BaseName, &NtoskrnlModuleObject.FullName); - NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE); - NtoskrnlModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader; - NtoskrnlModuleObject.Image.PE.OptionalHeader = &NtHeader->OptionalHeader; - NtoskrnlModuleObject.Image.PE.SectionList = IMAGE_FIRST_SECTION(NtHeader); - NtoskrnlModuleObject.EntryPoint = (PVOID) ((ULONG_PTR) NtoskrnlModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint); - DPRINT("ModuleObject:%08x entrypoint at %x\n", &NtoskrnlModuleObject, NtoskrnlModuleObject.EntryPoint); - NtoskrnlModuleObject.Length = NtoskrnlModuleObject.Image.PE.OptionalHeader->SizeOfImage; - NtoskrnlModuleObject.TextSection = &NtoskrnlTextSection; + NtHeader = RtlImageNtHeader((PVOID)KERNEL_BASE); + NtoskrnlModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader; + NtoskrnlModuleObject.Image.PE.OptionalHeader = &NtHeader->OptionalHeader; + NtoskrnlModuleObject.Image.PE.SectionList = IMAGE_FIRST_SECTION(NtHeader); + NtoskrnlModuleObject.EntryPoint = (PVOID) ((ULONG_PTR) NtoskrnlModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint); + DPRINT("ModuleObject:%08x entrypoint at %x\n", &NtoskrnlModuleObject, NtoskrnlModuleObject.EntryPoint); + NtoskrnlModuleObject.Length = NtoskrnlModuleObject.Image.PE.OptionalHeader->SizeOfImage; + NtoskrnlModuleObject.TextSection = &NtoskrnlTextSection; - InsertTailList(&ModuleListHead, - &NtoskrnlModuleObject.ListEntry); + InsertTailList(&ModuleListHead, + &NtoskrnlModuleObject.ListEntry); - /* Initialize ModuleObject for HAL */ - RtlZeroMemory(&HalModuleObject, sizeof(MODULE_OBJECT)); - HalModuleObject.Base = (PVOID) LdrHalBase; - HalModuleObject.Flags = MODULE_FLAG_PE; + /* Initialize ModuleObject for HAL */ + RtlZeroMemory(&HalModuleObject, sizeof(MODULE_OBJECT)); + HalModuleObject.Base = (PVOID) LdrHalBase; + HalModuleObject.Flags = MODULE_FLAG_PE; - RtlInitUnicodeString(&HalModuleObject.FullName, HAL_MODULE_NAME); - LdrpBuildModuleBaseName(&HalModuleObject.BaseName, &HalModuleObject.FullName); + RtlInitUnicodeString(&HalModuleObject.FullName, HAL_MODULE_NAME); + LdrpBuildModuleBaseName(&HalModuleObject.BaseName, &HalModuleObject.FullName); - NtHeader = RtlImageNtHeader((PVOID)LdrHalBase); - HalModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader; - HalModuleObject.Image.PE.OptionalHeader = &NtHeader->OptionalHeader; - HalModuleObject.Image.PE.SectionList = IMAGE_FIRST_SECTION(NtHeader); - HalModuleObject.EntryPoint = (PVOID) ((ULONG_PTR) HalModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint); - DPRINT("ModuleObject:%08x entrypoint at %x\n", &HalModuleObject, HalModuleObject.EntryPoint); - HalModuleObject.Length = HalModuleObject.Image.PE.OptionalHeader->SizeOfImage; - HalModuleObject.TextSection = &LdrHalTextSection; + NtHeader = RtlImageNtHeader((PVOID)LdrHalBase); + HalModuleObject.Image.PE.FileHeader = &NtHeader->FileHeader; + HalModuleObject.Image.PE.OptionalHeader = &NtHeader->OptionalHeader; + HalModuleObject.Image.PE.SectionList = IMAGE_FIRST_SECTION(NtHeader); + HalModuleObject.EntryPoint = (PVOID) ((ULONG_PTR) HalModuleObject.Base + NtHeader->OptionalHeader.AddressOfEntryPoint); + DPRINT("ModuleObject:%08x entrypoint at %x\n", &HalModuleObject, HalModuleObject.EntryPoint); + HalModuleObject.Length = HalModuleObject.Image.PE.OptionalHeader->SizeOfImage; + HalModuleObject.TextSection = &LdrHalTextSection; - InsertTailList(&ModuleListHead, - &HalModuleObject.ListEntry); + InsertTailList(&ModuleListHead, + &HalModuleObject.ListEntry); } NTSTATUS -LdrpLoadImage(PUNICODE_STRING DriverName, - PVOID *ModuleBase, - PVOID *SectionPointer, - PVOID *EntryPoint, - PVOID *ExportSectionPointer) +LdrpLoadImage ( + PUNICODE_STRING DriverName, + PVOID *ModuleBase, + PVOID *SectionPointer, + PVOID *EntryPoint, + PVOID *ExportSectionPointer ) { - PMODULE_OBJECT ModuleObject; - NTSTATUS Status; + PMODULE_OBJECT ModuleObject; + NTSTATUS Status; - ModuleObject = LdrGetModuleObject(DriverName); - if (ModuleObject == NULL) + ModuleObject = LdrGetModuleObject(DriverName); + if (ModuleObject == NULL) { - Status = LdrLoadModule(DriverName, &ModuleObject); - if (!NT_SUCCESS(Status)) - { - return(Status); - } + Status = LdrLoadModule(DriverName, &ModuleObject); + if (!NT_SUCCESS(Status)) + { + return(Status); + } } - if (ModuleBase) - *ModuleBase = ModuleObject->Base; + if (ModuleBase) + *ModuleBase = ModuleObject->Base; -// if (SectionPointer) -// *SectionPointer = ModuleObject-> + //if (SectionPointer) + // *SectionPointer = ModuleObject-> - if (EntryPoint) - *EntryPoint = ModuleObject->EntryPoint; + if (EntryPoint) + *EntryPoint = ModuleObject->EntryPoint; -// if (ExportSectionPointer) -// *ExportSectionPointer = ModuleObject-> + //if (ExportSectionPointer) + // *ExportSectionPointer = ModuleObject-> - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } NTSTATUS -LdrpUnloadImage(PVOID ModuleBase) +LdrpUnloadImage ( PVOID ModuleBase ) { - return(STATUS_NOT_IMPLEMENTED); + return(STATUS_NOT_IMPLEMENTED); } NTSTATUS -LdrpLoadAndCallImage(PUNICODE_STRING ModuleName) +LdrpLoadAndCallImage ( PUNICODE_STRING ModuleName ) { - PDRIVER_INITIALIZE DriverEntry; - PMODULE_OBJECT ModuleObject; - NTSTATUS Status; + PDRIVER_INITIALIZE DriverEntry; + PMODULE_OBJECT ModuleObject; + NTSTATUS Status; - ModuleObject = LdrGetModuleObject(ModuleName); - if (ModuleObject != NULL) + ModuleObject = LdrGetModuleObject(ModuleName); + if (ModuleObject != NULL) { - return(STATUS_IMAGE_ALREADY_LOADED); + return(STATUS_IMAGE_ALREADY_LOADED); } - Status = LdrLoadModule(ModuleName, &ModuleObject); - if (!NT_SUCCESS(Status)) + Status = LdrLoadModule(ModuleName, &ModuleObject); + if (!NT_SUCCESS(Status)) { - return(Status); + return(Status); } - DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint; + DriverEntry = (PDRIVER_INITIALIZE)ModuleObject->EntryPoint; - Status = DriverEntry(NULL, NULL); - if (!NT_SUCCESS(Status)) + Status = DriverEntry(NULL, NULL); + if (!NT_SUCCESS(Status)) { - LdrUnloadModule(ModuleObject); + LdrUnloadModule(ModuleObject); } - return(Status); + return(Status); } NTSTATUS -LdrLoadModule(PUNICODE_STRING Filename, - PMODULE_OBJECT *ModuleObject) +LdrLoadModule( + PUNICODE_STRING Filename, + PMODULE_OBJECT *ModuleObject ) { - PVOID ModuleLoadBase; - NTSTATUS Status; - HANDLE FileHandle; - OBJECT_ATTRIBUTES ObjectAttributes; - PMODULE_OBJECT Module; - FILE_STANDARD_INFORMATION FileStdInfo; - IO_STATUS_BLOCK IoStatusBlock; + PVOID ModuleLoadBase; + NTSTATUS Status; + HANDLE FileHandle; + OBJECT_ATTRIBUTES ObjectAttributes; + PMODULE_OBJECT Module; + FILE_STANDARD_INFORMATION FileStdInfo; + IO_STATUS_BLOCK IoStatusBlock; - *ModuleObject = NULL; + *ModuleObject = NULL; - DPRINT("Loading Module %wZ...\n", Filename); + DPRINT("Loading Module %wZ...\n", Filename); - /* Open the Module */ - InitializeObjectAttributes(&ObjectAttributes, - Filename, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - CHECKPOINT; - Status = ZwOpenFile(&FileHandle, - FILE_ALL_ACCESS, - &ObjectAttributes, - &IoStatusBlock, - 0, - FILE_SYNCHRONOUS_IO_NONALERT); - CHECKPOINT; - if (!NT_SUCCESS(Status)) + /* Open the Module */ + InitializeObjectAttributes(&ObjectAttributes, + Filename, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + CHECKPOINT; + Status = ZwOpenFile(&FileHandle, + FILE_ALL_ACCESS, + &ObjectAttributes, + &IoStatusBlock, + 0, + FILE_SYNCHRONOUS_IO_NONALERT); + CHECKPOINT; + if (!NT_SUCCESS(Status)) { - CPRINT("Could not open module file: %wZ\n", Filename); - return(Status); + CPRINT("Could not open module file: %wZ\n", Filename); + return(Status); } - CHECKPOINT; + CHECKPOINT; - /* Get the size of the file */ - Status = ZwQueryInformationFile(FileHandle, - &IoStatusBlock, - &FileStdInfo, - sizeof(FileStdInfo), - FileStandardInformation); - if (!NT_SUCCESS(Status)) + /* Get the size of the file */ + Status = ZwQueryInformationFile(FileHandle, + &IoStatusBlock, + &FileStdInfo, + sizeof(FileStdInfo), + FileStandardInformation); + if (!NT_SUCCESS(Status)) { - CPRINT("Could not get file size\n"); - NtClose(FileHandle); - return(Status); + CPRINT("Could not get file size\n"); + NtClose(FileHandle); + return(Status); } - CHECKPOINT; + CHECKPOINT; - /* Allocate nonpageable memory for driver */ - ModuleLoadBase = ExAllocatePoolWithTag(NonPagedPool, - FileStdInfo.EndOfFile.u.LowPart, - TAG_DRIVER_MEM); - if (ModuleLoadBase == NULL) + /* Allocate nonpageable memory for driver */ + ModuleLoadBase = ExAllocatePoolWithTag(NonPagedPool, + FileStdInfo.EndOfFile.u.LowPart, + TAG_DRIVER_MEM); + if (ModuleLoadBase == NULL) { - CPRINT("Could not allocate memory for module"); - NtClose(FileHandle); - return(STATUS_INSUFFICIENT_RESOURCES); + CPRINT("Could not allocate memory for module"); + NtClose(FileHandle); + return(STATUS_INSUFFICIENT_RESOURCES); } - CHECKPOINT; + CHECKPOINT; - /* Load driver into memory chunk */ - Status = ZwReadFile(FileHandle, - 0, 0, 0, - &IoStatusBlock, - ModuleLoadBase, - FileStdInfo.EndOfFile.u.LowPart, - 0, 0); - if (!NT_SUCCESS(Status)) + /* Load driver into memory chunk */ + Status = ZwReadFile(FileHandle, + 0, 0, 0, + &IoStatusBlock, + ModuleLoadBase, + FileStdInfo.EndOfFile.u.LowPart, + 0, 0); + if (!NT_SUCCESS(Status)) { - CPRINT("Could not read module file into memory"); - ExFreePool(ModuleLoadBase); - NtClose(FileHandle); - return(Status); + CPRINT("Could not read module file into memory"); + ExFreePool(ModuleLoadBase); + NtClose(FileHandle); + return(Status); } - CHECKPOINT; + CHECKPOINT; - ZwClose(FileHandle); + ZwClose(FileHandle); - Status = LdrProcessModule(ModuleLoadBase, - Filename, - &Module); - if (!NT_SUCCESS(Status)) + Status = LdrProcessModule(ModuleLoadBase, + Filename, + &Module); + if (!NT_SUCCESS(Status)) { - CPRINT("Could not process module\n"); - ExFreePool(ModuleLoadBase); - return(Status); + CPRINT("Could not process module\n"); + ExFreePool(ModuleLoadBase); + return(Status); } - /* Cleanup */ - ExFreePool(ModuleLoadBase); + /* Cleanup */ + ExFreePool(ModuleLoadBase); - *ModuleObject = Module; + *ModuleObject = Module; - /* Hook for KDB on loading a driver. */ - KDB_LOADDRIVER_HOOK(Filename, Module); + /* Hook for KDB on loading a driver. */ + KDB_LOADDRIVER_HOOK(Filename, Module); - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } NTSTATUS -LdrUnloadModule(PMODULE_OBJECT ModuleObject) +LdrUnloadModule ( PMODULE_OBJECT ModuleObject ) { - KIRQL Irql; + KIRQL Irql; - /* Remove the module from the module list */ - KeAcquireSpinLock(&ModuleListLock,&Irql); - RemoveEntryList(&ModuleObject->ListEntry); - KeReleaseSpinLock(&ModuleListLock, Irql); + /* Remove the module from the module list */ + KeAcquireSpinLock(&ModuleListLock,&Irql); + RemoveEntryList(&ModuleObject->ListEntry); + KeReleaseSpinLock(&ModuleListLock, Irql); - /* Hook for KDB on unloading a driver. */ - KDB_UNLOADDRIVER_HOOK(ModuleObject); + /* Hook for KDB on unloading a driver. */ + KDB_UNLOADDRIVER_HOOK(ModuleObject); - /* Free text section */ - if (ModuleObject->TextSection != NULL) + /* Free text section */ + if (ModuleObject->TextSection != NULL) { - ExFreePool(ModuleObject->TextSection->Name); - RemoveEntryList(&ModuleObject->TextSection->ListEntry); - ExFreePool(ModuleObject->TextSection); - ModuleObject->TextSection = NULL; + ExFreePool(ModuleObject->TextSection->Name); + RemoveEntryList(&ModuleObject->TextSection->ListEntry); + ExFreePool(ModuleObject->TextSection); + ModuleObject->TextSection = NULL; } - /* Free module section */ -// MmFreeSection(ModuleObject->Base); + /* Free module section */ + // MmFreeSection(ModuleObject->Base); - ExFreePool(ModuleObject->FullName.Buffer); - ExFreePool(ModuleObject); + ExFreePool(ModuleObject->FullName.Buffer); + ExFreePool(ModuleObject); - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } NTSTATUS -LdrProcessModule(PVOID ModuleLoadBase, - PUNICODE_STRING ModuleName, - PMODULE_OBJECT *ModuleObject) +LdrProcessModule( + PVOID ModuleLoadBase, + PUNICODE_STRING ModuleName, + PMODULE_OBJECT *ModuleObject ) { - PIMAGE_DOS_HEADER PEDosHeader; + PIMAGE_DOS_HEADER PEDosHeader; - /* If MZ header exists */ - PEDosHeader = (PIMAGE_DOS_HEADER) ModuleLoadBase; - if (PEDosHeader->e_magic == IMAGE_DOS_SIGNATURE && PEDosHeader->e_lfanew != 0L) + /* If MZ header exists */ + PEDosHeader = (PIMAGE_DOS_HEADER) ModuleLoadBase; + if (PEDosHeader->e_magic == IMAGE_DOS_SIGNATURE && PEDosHeader->e_lfanew != 0L) { - return LdrPEProcessModule(ModuleLoadBase, - ModuleName, - ModuleObject); + return LdrPEProcessModule(ModuleLoadBase, + ModuleName, + ModuleObject); } - CPRINT("Module wasn't PE\n"); - return STATUS_UNSUCCESSFUL; + CPRINT("Module wasn't PE\n"); + return STATUS_UNSUCCESSFUL; } NTSTATUS -LdrpQueryModuleInformation(PVOID Buffer, - ULONG Size, - PULONG ReqSize) +LdrpQueryModuleInformation ( + PVOID Buffer, + ULONG Size, + PULONG ReqSize ) { - PLIST_ENTRY current_entry; - PMODULE_OBJECT current; - ULONG ModuleCount = 0; - PSYSTEM_MODULE_INFORMATION Smi; - ANSI_STRING AnsiName; - PCHAR p; - KIRQL Irql; + PLIST_ENTRY current_entry; + PMODULE_OBJECT current; + ULONG ModuleCount = 0; + PSYSTEM_MODULE_INFORMATION Smi; + ANSI_STRING AnsiName; + PCHAR p; + KIRQL Irql; - KeAcquireSpinLock(&ModuleListLock,&Irql); + KeAcquireSpinLock(&ModuleListLock,&Irql); - /* calculate required size */ - current_entry = ModuleListHead.Flink; - while (current_entry != (&ModuleListHead)) + /* calculate required size */ + current_entry = ModuleListHead.Flink; + while (current_entry != (&ModuleListHead)) { - ModuleCount++; - current_entry = current_entry->Flink; + ModuleCount++; + current_entry = current_entry->Flink; } - *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+ - (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION_ENTRY); + *ReqSize = sizeof(SYSTEM_MODULE_INFORMATION)+ + (ModuleCount - 1) * sizeof(SYSTEM_MODULE_INFORMATION_ENTRY); - if (Size < *ReqSize) + if (Size < *ReqSize) { - KeReleaseSpinLock(&ModuleListLock, Irql); - return(STATUS_INFO_LENGTH_MISMATCH); + KeReleaseSpinLock(&ModuleListLock, Irql); + return(STATUS_INFO_LENGTH_MISMATCH); } - /* fill the buffer */ - memset(Buffer, '=', Size); + /* fill the buffer */ + memset(Buffer, '=', Size); - Smi = (PSYSTEM_MODULE_INFORMATION)Buffer; - Smi->Count = ModuleCount; + Smi = (PSYSTEM_MODULE_INFORMATION)Buffer; + Smi->Count = ModuleCount; - ModuleCount = 0; - current_entry = ModuleListHead.Flink; - while (current_entry != (&ModuleListHead)) + ModuleCount = 0; + current_entry = ModuleListHead.Flink; + while (current_entry != (&ModuleListHead)) { - current = CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry); + current = CONTAINING_RECORD(current_entry,MODULE_OBJECT,ListEntry); - Smi->Module[ModuleCount].Unknown1 = 0; /* Always 0 */ - Smi->Module[ModuleCount].Unknown2 = 0; /* Always 0 */ - Smi->Module[ModuleCount].Base = current->Base; - Smi->Module[ModuleCount].Size = current->Length; - Smi->Module[ModuleCount].Flags = 0; /* Flags ??? (GN) */ - Smi->Module[ModuleCount].Index = (USHORT)ModuleCount; - Smi->Module[ModuleCount].NameLength = 0; - Smi->Module[ModuleCount].LoadCount = 0; /* FIXME */ + Smi->Module[ModuleCount].Unknown1 = 0; /* Always 0 */ + Smi->Module[ModuleCount].Unknown2 = 0; /* Always 0 */ + Smi->Module[ModuleCount].Base = current->Base; + Smi->Module[ModuleCount].Size = current->Length; + Smi->Module[ModuleCount].Flags = 0; /* Flags ??? (GN) */ + Smi->Module[ModuleCount].Index = (USHORT)ModuleCount; + Smi->Module[ModuleCount].NameLength = 0; + Smi->Module[ModuleCount].LoadCount = 0; /* FIXME */ - AnsiName.Length = 0; - AnsiName.MaximumLength = 256; - AnsiName.Buffer = Smi->Module[ModuleCount].ImageName; - RtlUnicodeStringToAnsiString(&AnsiName, - ¤t->FullName, - FALSE); + AnsiName.Length = 0; + AnsiName.MaximumLength = 256; + AnsiName.Buffer = Smi->Module[ModuleCount].ImageName; + RtlUnicodeStringToAnsiString(&AnsiName, + ¤t->FullName, + FALSE); - p = strrchr(AnsiName.Buffer, '\\'); - if (p == NULL) - { - Smi->Module[ModuleCount].PathLength = 0; - } - else - { - p++; - Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer; - } + p = strrchr(AnsiName.Buffer, '\\'); + if (p == NULL) + { + Smi->Module[ModuleCount].PathLength = 0; + } + else + { + p++; + Smi->Module[ModuleCount].PathLength = p - AnsiName.Buffer; + } - ModuleCount++; - current_entry = current_entry->Flink; + ModuleCount++; + current_entry = current_entry->Flink; } - KeReleaseSpinLock(&ModuleListLock, Irql); + KeReleaseSpinLock(&ModuleListLock, Irql); - return(STATUS_SUCCESS); + return(STATUS_SUCCESS); } static VOID -LdrpBuildModuleBaseName(PUNICODE_STRING BaseName, - PUNICODE_STRING FullName) +LdrpBuildModuleBaseName ( + PUNICODE_STRING BaseName, + PUNICODE_STRING FullName ) { - PWCHAR p; + PWCHAR p; - DPRINT("LdrpBuildModuleBaseName()\n"); - DPRINT("FullName %wZ\n", FullName); + DPRINT("LdrpBuildModuleBaseName()\n"); + DPRINT("FullName %wZ\n", FullName); - p = wcsrchr(FullName->Buffer, L'\\'); - if (p == NULL) - { - p = FullName->Buffer; - } - else - { - p++; - } + p = wcsrchr(FullName->Buffer, L'\\'); + if (p == NULL) + { + p = FullName->Buffer; + } + else + { + p++; + } - DPRINT("p %S\n", p); + DPRINT("p %S\n", p); - RtlInitUnicodeString(BaseName, p); + RtlInitUnicodeString(BaseName, p); } static LONG -LdrpCompareModuleNames(IN PUNICODE_STRING String1, - IN PUNICODE_STRING String2) +LdrpCompareModuleNames ( + IN PUNICODE_STRING String1, + IN PUNICODE_STRING String2 ) { - ULONG len1, len2, i; - PWCHAR s1, s2, p; - WCHAR c1, c2; + ULONG len1, len2, i; + PWCHAR s1, s2, p; + WCHAR c1, c2; - if (String1 && String2) + if (String1 && String2) { - /* Search String1 for last path component */ - len1 = String1->Length / sizeof(WCHAR); - s1 = String1->Buffer; - for (i = 0, p = String1->Buffer; i < String1->Length; i = i + sizeof(WCHAR), p++) - { - if (*p == L'\\') - { - if (i == String1->Length - sizeof(WCHAR)) - { - s1 = NULL; - len1 = 0; - } - else - { - s1 = p + 1; - len1 = (String1->Length - i) / sizeof(WCHAR); - } - } - } + /* Search String1 for last path component */ + len1 = String1->Length / sizeof(WCHAR); + s1 = String1->Buffer; + for (i = 0, p = String1->Buffer; i < String1->Length; i = i + sizeof(WCHAR), p++) + { + if (*p == L'\\') + { + if (i == String1->Length - sizeof(WCHAR)) + { + s1 = NULL; + len1 = 0; + } + else + { + s1 = p + 1; + len1 = (String1->Length - i) / sizeof(WCHAR); + } + } + } - /* Search String2 for last path component */ - len2 = String2->Length / sizeof(WCHAR); - s2 = String2->Buffer; - for (i = 0, p = String2->Buffer; i < String2->Length; i = i + sizeof(WCHAR), p++) - { - if (*p == L'\\') - { - if (i == String2->Length - sizeof(WCHAR)) - { - s2 = NULL; - len2 = 0; - } - else - { - s2 = p + 1; - len2 = (String2->Length - i) / sizeof(WCHAR); - } - } - } + /* Search String2 for last path component */ + len2 = String2->Length / sizeof(WCHAR); + s2 = String2->Buffer; + for (i = 0, p = String2->Buffer; i < String2->Length; i = i + sizeof(WCHAR), p++) + { + if (*p == L'\\') + { + if (i == String2->Length - sizeof(WCHAR)) + { + s2 = NULL; + len2 = 0; + } + else + { + s2 = p + 1; + len2 = (String2->Length - i) / sizeof(WCHAR); + } + } + } - /* Compare last path components */ - if (s1 && s2) - { - while (1) - { - c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0; - c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0; - if ((c1 == 0 && c2 == L'.') || (c1 == L'.' && c2 == 0)) - return(0); - if (!c1 || !c2 || c1 != c2) - return(c1 - c2); - } - } + /* Compare last path components */ + if (s1 && s2) + { + while (1) + { + c1 = len1-- ? RtlUpcaseUnicodeChar (*s1++) : 0; + c2 = len2-- ? RtlUpcaseUnicodeChar (*s2++) : 0; + if ((c1 == 0 && c2 == L'.') || (c1 == L'.' && c2 == 0)) + return(0); + if (!c1 || !c2 || c1 != c2) + return(c1 - c2); + } + } } - return(0); + return(0); } PMODULE_OBJECT -LdrGetModuleObject(PUNICODE_STRING ModuleName) +LdrGetModuleObject ( PUNICODE_STRING ModuleName ) { - PMODULE_OBJECT Module; - PLIST_ENTRY Entry; - KIRQL Irql; + PMODULE_OBJECT Module; + PLIST_ENTRY Entry; + KIRQL Irql; - DPRINT("LdrGetModuleObject(%wZ) called\n", ModuleName); + DPRINT("LdrGetModuleObject(%wZ) called\n", ModuleName); - KeAcquireSpinLock(&ModuleListLock,&Irql); + KeAcquireSpinLock(&ModuleListLock,&Irql); - Entry = ModuleListHead.Flink; - while (Entry != &ModuleListHead) + Entry = ModuleListHead.Flink; + while (Entry != &ModuleListHead) { - Module = CONTAINING_RECORD(Entry, MODULE_OBJECT, ListEntry); + Module = CONTAINING_RECORD(Entry, MODULE_OBJECT, ListEntry); - DPRINT("Comparing %wZ and %wZ\n", - &Module->BaseName, [truncated at 1000 lines; 1790 more skipped]
19 years, 8 months
1
0
0
0
[arty] 14544: Adapter: some info display.
by arty@svn.reactos.com
Adapter: some info display. Socket: implemented send and recv. Modified: trunk/reactos/subsys/system/dhcp/adapter.c Modified: trunk/reactos/subsys/system/dhcp/socket.c _____ Modified: trunk/reactos/subsys/system/dhcp/adapter.c --- trunk/reactos/subsys/system/dhcp/adapter.c 2005-04-08 11:04:13 UTC (rev 14543) +++ trunk/reactos/subsys/system/dhcp/adapter.c 2005-04-08 11:08:26 UTC (rev 14544) @@ -91,7 +91,9 @@ Adapter->DhclientConfig.retry_interval; strncpy(Adapter->DhclientInfo.name, Adapter->IfMib.bDescr, sizeof(Adapter->DhclientInfo.name)); - DH_DbgPrint(MID_TRACE,("Adapter Name: [%s]\n", Adapter->DhclientInfo.name)); + DH_DbgPrint(MID_TRACE,("Adapter Name: [%s] (Bind Status %x)\n", + Adapter->DhclientInfo.name, + Adapter->BindStatus)); ifi = &Adapter->DhclientInfo; } } @@ -156,6 +158,7 @@ } void if_register_send(struct interface_info *ip) { + } void if_register_receive(struct interface_info *ip) { _____ Modified: trunk/reactos/subsys/system/dhcp/socket.c --- trunk/reactos/subsys/system/dhcp/socket.c 2005-04-08 11:04:13 UTC (rev 14543) +++ trunk/reactos/subsys/system/dhcp/socket.c 2005-04-08 11:08:26 UTC (rev 14544) @@ -12,7 +12,18 @@ struct in_addr addr, struct sockaddr_in *broadcast, struct hardware *hardware ) { - return 0; + int result = + sendto( ip->wfdesc, (char *)p, size, 0, + (struct sockaddr *)broadcast, sizeof(*broadcast) ); + + if (result < 0) { + note ("send_packet: %x", result); + if (result == WSAENETUNREACH) + note ("send_packet: please consult README file%s", + " regarding broadcast address."); + } + + return result; } ssize_t receive_packet(struct interface_info *ip, @@ -20,5 +31,9 @@ size_t packet_len, struct sockaddr_in *dest, struct hardware *hardware ) { - return 0; + int recv_addr_size = sizeof(*dest); + int result = + recvfrom (ip -> rfdesc, (char *)packet_data, packet_len, 0, + (struct sockaddr *)dest, &recv_addr_size ); + return result; }
19 years, 8 months
1
0
0
0
← Newer
1
...
30
31
32
33
34
35
36
...
48
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
41
42
43
44
45
46
47
48
Results per page:
10
25
50
100
200