- Fix the stupid mess we created when making this from the cmake branch

- Part 1 of 2

svn path=/branches/GSoC_2011/TcpIpDriver/; revision=53074
This commit is contained in:
Cameron Gutman
2011-08-05 02:25:05 +00:00
parent 52848c4373
commit 794ae4203f
88 changed files with 4483 additions and 3768 deletions
+10 -10
View File
@@ -1,10 +1,10 @@
# small trick to get the real source directory at this stage
STRING(REPLACE "/PreLoad.cmake" "" REACTOS_HOME_DIR ${CMAKE_CURRENT_LIST_FILE})
#message("/PreLoad.cmake ... ${REACTOS_HOME_DIR}")
SET(CMAKE_MODULE_PATH "${REACTOS_HOME_DIR}/cmake" CACHE INTERNAL "")
#message("CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}")
# small trick to get the real source directory at this stage
STRING(REPLACE "/PreLoad.cmake" "" REACTOS_HOME_DIR ${CMAKE_CURRENT_LIST_FILE})
#message("/PreLoad.cmake ... ${REACTOS_HOME_DIR}")
SET(CMAKE_MODULE_PATH "${REACTOS_HOME_DIR}/cmake" CACHE INTERNAL "")
#message("CMAKE_MODULE_PATH = ${CMAKE_MODULE_PATH}")
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -3,8 +3,6 @@
* UPDATED: 2010-12-12
*/
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_GERMAN, SUBLANG_GERMAN
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL
IDR_MAINMENU MENU
-2
View File
@@ -6,8 +6,6 @@
* IRC: irc.freenode.net #reactos-pl;
*/
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -1,5 +1,3 @@
#pragma code_page(65001) /* UTF-8 */
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -3,8 +3,6 @@
* LAST CHANGE: 26-07-2010
*/
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
IDR_MAINMENU MENU
-2
View File
@@ -6,8 +6,6 @@
* TRANSLATOR: Sakara Yevhen, Igor Paliychuk
*/
#pragma code_page(65001) // UTF-8
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
IDR_MAINMENU MENU
+3 -1
View File
@@ -56,6 +56,7 @@ PUBLIC _mainCRTStartup // For Mingw32 builds where the linker looks for this sym
_mainCRTStartup:
PUBLIC start
start:
#if 0
.byte HEX(e9)
.byte HEX(fd)
.byte HEX(01)
@@ -134,7 +135,7 @@ LoadFile_Done:
// Reads the entire FAT into memory at 7000:0000
ReadFatIntoMemory:
mov ax, [bp+HiddenSectors]
mov ax, [bp+HiddenSectors]
mov dx, [bp+HiddenSectors+2]
add ax, [bp+ReservedSectors]
adc dx, 0
@@ -233,6 +234,7 @@ msgLoading: .asciz "Loading FreeLoader...\r\n"
.org HEX(1fe) // Pad to 510 bytes
.word HEX(0aa55) // BootSector signature
#endif
.endcode16
-72
View File
@@ -2,79 +2,7 @@
#include <asm.inc>
.code16
PUBLIC _mainCRTStartup
_mainCRTStartup:
_LoaderEntry:
ret
.endcode16
.code32
// globals
PUBLIC _BootPartition
_BootPartition:
PUBLIC _BootDrive
_BootDrive:
PUBLIC _PageDirectoryStart
_PageDirectoryStart:
PUBLIC _PageDirectoryEnd
_PageDirectoryEnd:
PUBLIC _startup_pagedirectory
_startup_pagedirectory:
PUBLIC _apic_pagetable
_apic_pagetable:
PUBLIC _kernel_pagetable
_kernel_pagetable:
PUBLIC _lowmem_pagetable
_lowmem_pagetable:
PUBLIC RealEntryPoint
RealEntryPoint:
PUBLIC _EnableA20
_EnableA20:
PUBLIC _ChainLoadBiosBootSectorCode
_ChainLoadBiosBootSectorCode:
PUBLIC _BootOldLinuxKernel
_BootOldLinuxKernel:
PUBLIC _BootNewLinuxKernel
_BootNewLinuxKernel:
PUBLIC _SoftReboot
_SoftReboot:
PUBLIC _DriveMapOldInt13HandlerAddress
_DriveMapOldInt13HandlerAddress:
PUBLIC _DriveMapInt13HandlerStart
_DriveMapInt13HandlerStart:
PUBLIC _DriveMapInt13HandlerEnd
_DriveMapInt13HandlerEnd:
PUBLIC _DriveMapInt13HandlerMapList
_DriveMapInt13HandlerMapList:
PUBLIC _PnpBiosGetDeviceNode
_PnpBiosGetDeviceNode:
PUBLIC _PnpBiosGetDeviceNodeCount
_PnpBiosGetDeviceNodeCount:
PUBLIC _PnpBiosSupported
_PnpBiosSupported:
PUBLIC _Int386
_Int386:
END
-11
View File
@@ -54,17 +54,6 @@ VOID BootMain(LPSTR CmdLine)
RunLoader();
}
#ifdef _MSC_VER
long _ftol2(double f)
{
return _ftol(f);
}
long _ftol2_sse(double f)
{
return _ftol(f);
}
#endif
// We need to emulate these, because the original ones don't work in freeldr
int __cdecl wctomb(char *mbchar, wchar_t wchar)
{
+241 -241
View File
@@ -1,241 +1,241 @@
macro(set_cpp)
include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
set(IS_CPP 1)
add_definitions(
-DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++
-DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt)
endmacro()
macro(add_dependency_node _node)
if(GENERATE_DEPENDENCY_GRAPH)
get_target_property(_type ${_node} TYPE)
if(_type MATCHES SHARED_LIBRARY OR ${_node} MATCHES ntoskrnl)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <node id=\"${_node}\"/>\n")
endif()
endif()
endmacro()
macro(add_dependency_edge _source _target)
if(GENERATE_DEPENDENCY_GRAPH)
get_target_property(_type ${_source} TYPE)
if(_type MATCHES SHARED_LIBRARY)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <edge source=\"${_source}\" target=\"${_target}\"/>\n")
endif()
endif()
endmacro()
macro(add_dependency_header)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<graphml>\n <graph id=\"ReactOS dependencies\" edgedefault=\"directed\">\n")
endmacro()
macro(add_dependency_footer)
add_dependency_node(ntdll)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " </graph>\n</graphml>\n")
endmacro()
macro(add_message_headers)
foreach(_in_FILE ${ARGN})
get_filename_component(FILE ${_in_FILE} NAME_WE)
macro_mc(${FILE})
add_custom_command(
OUTPUT ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h
COMMAND ${COMMAND_MC}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc)
set_source_files_properties(
${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc
PROPERTIES GENERATED TRUE)
add_custom_target(${FILE} ALL DEPENDS ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc)
endforeach()
endmacro()
macro(dir_to_num dir var)
if(${dir} STREQUAL reactos/system32)
set(${var} 1)
elseif(${dir} STREQUAL reactos/system32/drivers)
set(${var} 2)
elseif(${dir} STREQUAL reactos/Fonts)
set(${var} 3)
elseif(${dir} STREQUAL reactos)
set(${var} 4)
elseif(${dir} STREQUAL reactos/system32/drivers/etc)
set(${var} 5)
elseif(${dir} STREQUAL reactos/inf)
set(${var} 6)
elseif(${dir} STREQUAL reactos/bin)
set(${var} 7)
elseif(${dir} STREQUAL reactos/media)
set(${var} 8)
else()
message(ERROR "Wrong destination: ${dir}")
endif()
endmacro()
function(add_cd_file)
cmake_parse_arguments(_CD "NO_CAB" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN})
if(NOT (_CD_TARGET OR _CD_FILE))
message(FATAL_ERROR "You must provide a target or a file to install!")
endif()
if(NOT _CD_DESTINATION)
message(FATAL_ERROR "You must provide a destination")
elseif(${_CD_DESTINATION} STREQUAL root)
set(_CD_DESTINATION "")
endif()
if(NOT _CD_FOR)
message(FATAL_ERROR "You must provide a cd name (or "all" for all of them) to install the file on!")
endif()
#get file if we need to
if(NOT _CD_FILE)
get_target_property(_CD_FILE ${_CD_TARGET} LOCATION)
endif()
#do we add it to all CDs?
if(_CD_FOR STREQUAL all)
set(_CD_FOR "bootcd;livecd;regtest")
endif()
#do we add it to bootcd?
list(FIND _CD_FOR bootcd __cd)
if(NOT __cd EQUAL -1)
#whether or not we should put it in reactos.cab or directly on cd
if(_CD_NO_CAB)
#directly on cd
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(bootcd ${_CD_TARGET})
endif()
else()
#add it in reactos.cab
dir_to_num(${_CD_DESTINATION} _num)
if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n")
else()
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${_CD_FILE}\" ${_num}\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(reactos_cab ${_CD_TARGET})
endif()
endif()
endif() #end bootcd
#do we add it to livecd?
list(FIND _CD_FOR livecd __cd)
if(NOT __cd EQUAL -1)
#manage dependency
if(_CD_TARGET)
add_dependencies(livecd ${_CD_TARGET})
endif()
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
endif() #end livecd
#do we add it to regtest?
list(FIND _CD_FOR regtest __cd)
if(NOT __cd EQUAL -1)
#whether or not we should put it in reactos.cab or directly on cd
if(_CD_NO_CAB)
#directly on cd
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(bootcdregtest ${_CD_TARGET})
endif()
else()
#add it in reactos.cab
#dir_to_num(${_CD_DESTINATION} _num)
#file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n")
#if(_CD_TARGET)
# #manage dependency
# add_dependencies(reactos_cab ${_CD_TARGET})
#endif()
endif()
endif() #end bootcd
endfunction()
# Create module_clean targets
function(add_clean_target target)
if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR MATCHES "MinGW Makefiles")
set(CLEAN_COMMAND make clean)
elseif(CMAKE_GENERATOR MATCHES "NMake Makefiles")
set(CLEAN_COMMAND nmake clean)
endif()
add_custom_target(${target}_clean
COMMAND ${CLEAN_COMMAND}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Cleaning ${target}")
endfunction()
if(NOT MSVC_IDE)
function(add_library name)
_add_library(${name} ${ARGN})
add_clean_target(${name})
endfunction()
function(add_executable name)
_add_executable(${name} ${ARGN})
add_clean_target(${name})
endfunction()
endif()
if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
macro(to_win_path _cmake_path _native_path)
string(REPLACE "/" "\\" ${_native_path} "${_cmake_path}")
endmacro()
macro(concatenate_files _file1 _file2 _output)
to_win_path("${_file1}" _real_file1)
to_win_path("${_file2}" _real_file2)
to_win_path("${_output}" _real_output)
add_custom_command(
OUTPUT ${_output}
COMMAND cmd.exe /C "copy /Y /B ${_real_file1} + ${_real_file2} ${_real_output} > nul"
DEPENDS ${_file1}
DEPENDS ${_file2})
endmacro()
else()
macro(concatenate_files _file1 _file2 _output)
add_custom_command(
OUTPUT ${_output}
COMMAND cat ${_file1} ${_file2} > ${_output}
DEPENDS ${_file1}
DEPENDS ${_file2})
endmacro()
endif()
macro(add_importlibs MODULE)
add_dependency_node(${MODULE})
foreach(LIB ${ARGN})
if ("${LIB}" MATCHES "msvcrt")
add_definitions(-D_DLL -D__USE_CRTIMP)
target_link_libraries(${MODULE} msvcrtex)
endif()
target_link_libraries(${MODULE} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}${CMAKE_STATIC_LIBRARY_SUFFIX})
add_dependencies(${MODULE} lib${LIB})
add_dependency_edge(${MODULE} ${LIB})
endforeach()
endmacro()
macro(set_cpp)
include_directories(BEFORE ${REACTOS_SOURCE_DIR}/include/c++/stlport)
set(IS_CPP 1)
add_definitions(
-DNATIVE_CPP_INCLUDE=${REACTOS_SOURCE_DIR}/include/c++
-DNATIVE_C_INCLUDE=${REACTOS_SOURCE_DIR}/include/crt)
endmacro()
macro(add_dependency_node _node)
if(GENERATE_DEPENDENCY_GRAPH)
get_target_property(_type ${_node} TYPE)
if(_type MATCHES SHARED_LIBRARY OR ${_node} MATCHES ntoskrnl)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <node id=\"${_node}\"/>\n")
endif()
endif()
endmacro()
macro(add_dependency_edge _source _target)
if(GENERATE_DEPENDENCY_GRAPH)
get_target_property(_type ${_source} TYPE)
if(_type MATCHES SHARED_LIBRARY)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " <edge source=\"${_source}\" target=\"${_target}\"/>\n")
endif()
endif()
endmacro()
macro(add_dependency_header)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<graphml>\n <graph id=\"ReactOS dependencies\" edgedefault=\"directed\">\n")
endmacro()
macro(add_dependency_footer)
add_dependency_node(ntdll)
file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " </graph>\n</graphml>\n")
endmacro()
macro(add_message_headers)
foreach(_in_FILE ${ARGN})
get_filename_component(FILE ${_in_FILE} NAME_WE)
macro_mc(${FILE})
add_custom_command(
OUTPUT ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h
COMMAND ${COMMAND_MC}
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${FILE}.mc)
set_source_files_properties(
${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc
PROPERTIES GENERATED TRUE)
add_custom_target(${FILE} ALL DEPENDS ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.h ${REACTOS_BINARY_DIR}/include/reactos/${FILE}.rc)
endforeach()
endmacro()
macro(dir_to_num dir var)
if(${dir} STREQUAL reactos/system32)
set(${var} 1)
elseif(${dir} STREQUAL reactos/system32/drivers)
set(${var} 2)
elseif(${dir} STREQUAL reactos/Fonts)
set(${var} 3)
elseif(${dir} STREQUAL reactos)
set(${var} 4)
elseif(${dir} STREQUAL reactos/system32/drivers/etc)
set(${var} 5)
elseif(${dir} STREQUAL reactos/inf)
set(${var} 6)
elseif(${dir} STREQUAL reactos/bin)
set(${var} 7)
elseif(${dir} STREQUAL reactos/media)
set(${var} 8)
else()
message(ERROR "Wrong destination: ${dir}")
endif()
endmacro()
function(add_cd_file)
cmake_parse_arguments(_CD "NO_CAB" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN})
if(NOT (_CD_TARGET OR _CD_FILE))
message(FATAL_ERROR "You must provide a target or a file to install!")
endif()
if(NOT _CD_DESTINATION)
message(FATAL_ERROR "You must provide a destination")
elseif(${_CD_DESTINATION} STREQUAL root)
set(_CD_DESTINATION "")
endif()
if(NOT _CD_FOR)
message(FATAL_ERROR "You must provide a cd name (or "all" for all of them) to install the file on!")
endif()
#get file if we need to
if(NOT _CD_FILE)
get_target_property(_CD_FILE ${_CD_TARGET} LOCATION)
endif()
#do we add it to all CDs?
if(_CD_FOR STREQUAL all)
set(_CD_FOR "bootcd;livecd;regtest")
endif()
#do we add it to bootcd?
list(FIND _CD_FOR bootcd __cd)
if(NOT __cd EQUAL -1)
#whether or not we should put it in reactos.cab or directly on cd
if(_CD_NO_CAB)
#directly on cd
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(bootcd ${_CD_TARGET})
endif()
else()
#add it in reactos.cab
dir_to_num(${_CD_DESTINATION} _num)
if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n")
else()
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "\"${_CD_FILE}\" ${_num}\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(reactos_cab ${_CD_TARGET})
endif()
endif()
endif() #end bootcd
#do we add it to livecd?
list(FIND _CD_FOR livecd __cd)
if(NOT __cd EQUAL -1)
#manage dependency
if(_CD_TARGET)
add_dependencies(livecd ${_CD_TARGET})
endif()
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/livecd.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
endif() #end livecd
#do we add it to regtest?
list(FIND _CD_FOR regtest __cd)
if(NOT __cd EQUAL -1)
#whether or not we should put it in reactos.cab or directly on cd
if(_CD_NO_CAB)
#directly on cd
foreach(item ${_CD_FILE})
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(COPY \"${item}\" DESTINATION \"\${CD_DIR}/${_CD_DESTINATION}\")\n")
endforeach()
if(_CD_NAME_ON_CD)
get_filename_component(__file ${_CD_FILE} NAME)
#rename it in the cd tree
file(APPEND ${REACTOS_BINARY_DIR}/boot/bootcdregtest.cmake "file(RENAME \${CD_DIR}/${_CD_DESTINATION}/${__file} \${CD_DIR}/${_CD_DESTINATION}/${_CD_NAME_ON_CD})\n")
endif()
if(_CD_TARGET)
#manage dependency
add_dependencies(bootcdregtest ${_CD_TARGET})
endif()
else()
#add it in reactos.cab
#dir_to_num(${_CD_DESTINATION} _num)
#file(APPEND ${REACTOS_BINARY_DIR}/boot/bootdata/packages/reactos.dff.dyn "${_CD_FILE} ${_num}\n")
#if(_CD_TARGET)
# #manage dependency
# add_dependencies(reactos_cab ${_CD_TARGET})
#endif()
endif()
endif() #end bootcd
endfunction()
# Create module_clean targets
function(add_clean_target target)
if(CMAKE_GENERATOR MATCHES "Unix Makefiles" OR CMAKE_GENERATOR MATCHES "MinGW Makefiles")
set(CLEAN_COMMAND make clean)
elseif(CMAKE_GENERATOR MATCHES "NMake Makefiles")
set(CLEAN_COMMAND nmake clean)
endif()
add_custom_target(${target}_clean
COMMAND ${CLEAN_COMMAND}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
COMMENT "Cleaning ${target}")
endfunction()
if(NOT MSVC_IDE)
function(add_library name)
_add_library(${name} ${ARGN})
add_clean_target(${name})
endfunction()
function(add_executable name)
_add_executable(${name} ${ARGN})
add_clean_target(${name})
endfunction()
endif()
if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows)
macro(to_win_path _cmake_path _native_path)
string(REPLACE "/" "\\" ${_native_path} "${_cmake_path}")
endmacro()
macro(concatenate_files _file1 _file2 _output)
to_win_path("${_file1}" _real_file1)
to_win_path("${_file2}" _real_file2)
to_win_path("${_output}" _real_output)
add_custom_command(
OUTPUT ${_output}
COMMAND cmd.exe /C "copy /Y /B ${_real_file1} + ${_real_file2} ${_real_output} > nul"
DEPENDS ${_file1}
DEPENDS ${_file2})
endmacro()
else()
macro(concatenate_files _file1 _file2 _output)
add_custom_command(
OUTPUT ${_output}
COMMAND cat ${_file1} ${_file2} > ${_output}
DEPENDS ${_file1}
DEPENDS ${_file2})
endmacro()
endif()
macro(add_importlibs MODULE)
add_dependency_node(${MODULE})
foreach(LIB ${ARGN})
if ("${LIB}" MATCHES "msvcrt")
add_definitions(-D_DLL -D__USE_CRTIMP)
target_link_libraries(${MODULE} msvcrtex)
endif()
target_link_libraries(${MODULE} ${CMAKE_BINARY_DIR}/importlibs/lib${LIB}${CMAKE_STATIC_LIBRARY_SUFFIX})
add_dependencies(${MODULE} lib${LIB})
add_dependency_edge(${MODULE} ${LIB})
endforeach()
endmacro()
+276 -276
View File
@@ -1,276 +1,276 @@
# try to load any previously computed information for C on this platform
INCLUDE( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake OPTIONAL)
# try to load any previously computed information for CXX on this platform
INCLUDE( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake OPTIONAL)
SET(WIN32 1)
INCLUDE(Platform/cl)
############
# Detect WDK build environment
IF($ENV{DDKBUILDENV} MATCHES "chk")
MESSAGE(STATUS "DDK/WDK checked build environment detected.")
SET(CMAKE_USE_WDK_ENV 1)
ENDIF()
IF($ENV{DDKBUILDENV} MATCHES "fre")
MESSAGE(STATUS "DDK/WDK free build environment detected.")
SET(CMAKE_USE_WDK_ENV 1)
ENDIF()
if(CMAKE_USE_WDK_ENV)
# Detect output architecture
if(NOT ARCH)
if($ENV{AMD64} MATCHES 1)
set(ARCH amd64)
set(MSVC_C_ARCHITECTURE_ID 64)
else()
set(ARCH i386)
endif()
endif()
# Add library directories
STRING(REPLACE * ${ARCH} ATL_LIB_PATH $ENV{ATL_LIB_PATH})
STRING(REPLACE * ${ARCH} CRT_LIB_PATH $ENV{CRT_LIB_PATH})
STRING(REPLACE * ${ARCH} DDK_LIB_PATH $ENV{DDK_LIB_PATH})
STRING(REPLACE * ${ARCH} KMDF_LIB_PATH $ENV{KMDF_LIB_PATH})
STRING(REPLACE * ${ARCH} MFC_LIB_PATH $ENV{MFC_LIB_PATH})
STRING(REPLACE * ${ARCH} SDK_LIB_PATH $ENV{SDK_LIB_PATH})
LINK_DIRECTORIES(${ATL_LIB_PATH}
${CRT_LIB_PATH}
${DDK_LIB_PATH}
${IFSKIT_LIB_PATH}
${KMDF_LIB_PATH}
${MFC_LIB_PATH}
${SDK_LIB_PATH})
# Add environment variables
if(NOT CMAKE_CROSSCOMPILING)
set(ENV{INCLUDE} "$ENV{CRT_INC_PATH};$ENV{SDK_INC_PATH};$ENV{SDK_INC_PATH}\\crt\\stl60")
include_directories($ENV{INCLUDE})
set(ENV{LIBPATH} "${CRT_LIB_PATH};${SDK_LIB_PATH}")
set(ENV{USE_MSVCRT} 1)
set(ENV{USE_STL} 1)
set(ENV{STL_VER} 60)
endif()
endif()
############
SET(CMAKE_CREATE_WIN32_EXE /subsystem:windows)
SET(CMAKE_CREATE_CONSOLE_EXE /subsystem:console)
IF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
SET (CMAKE_NO_BUILD_TYPE 1)
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
IF(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio")
SET (CMAKE_NO_BUILD_TYPE 1)
SET (CMAKE_CONFIGURATION_TYPES "Debug;Release;MinSizeRel;RelWithDebInfo" CACHE STRING
"Semicolon separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.")
MARK_AS_ADVANCED(CMAKE_CONFIGURATION_TYPES)
ENDIF(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio")
# does the compiler support pdbtype and is it the newer compiler
IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
SET(CMAKE_COMPILER_2005 1)
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
# make sure to enable languages after setting configuration types
ENABLE_LANGUAGE(RC)
SET(CMAKE_COMPILE_RESOURCE "rc <FLAGS> /fo<OBJECT> <SOURCE>")
# for nmake we need to compute some information about the compiler
# that is being used.
# the compiler may be free command line, 6, 7, or 71, and
# each have properties that must be determined.
# to avoid running these tests with each cmake run, the
# test results are saved in CMakeCPlatform.cmake, a file
# that is automatically copied into try_compile directories
# by the global generator.
SET(MSVC_IDE 1)
IF(CMAKE_GENERATOR MATCHES "Makefiles")
SET(MSVC_IDE 0)
IF(NOT CMAKE_VC_COMPILER_TESTS_RUN)
SET(CMAKE_VC_COMPILER_TESTS 1)
SET(testNmakeCLVersionFile
"${CMAKE_ROOT}/Modules/CMakeTestNMakeCLVersion.c")
STRING(REGEX REPLACE "/" "\\\\" testNmakeCLVersionFile "${testNmakeCLVersionFile}")
MESSAGE(STATUS "Check for CL compiler version")
SET(CMAKE_TEST_COMPILER ${CMAKE_C_COMPILER})
IF (NOT CMAKE_C_COMPILER)
SET(CMAKE_TEST_COMPILER ${CMAKE_CXX_COMPILER})
ENDIF(NOT CMAKE_C_COMPILER)
EXEC_PROGRAM(${CMAKE_TEST_COMPILER}
ARGS /nologo -EP \"${testNmakeCLVersionFile}\"
OUTPUT_VARIABLE CMAKE_COMPILER_OUTPUT
RETURN_VALUE CMAKE_COMPILER_RETURN
)
IF(NOT CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining the version of compiler passed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
STRING(REGEX REPLACE "\n" " " compilerVersion "${CMAKE_COMPILER_OUTPUT}")
STRING(REGEX REPLACE ".*VERSION=(.*)" "\\1"
compilerVersion "${compilerVersion}")
MESSAGE(STATUS "Check for CL compiler version - ${compilerVersion}")
SET(MSVC60)
SET(MSVC70)
SET(MSVC71)
SET(MSVC80)
SET(CMAKE_COMPILER_2005)
IF("${compilerVersion}" LESS 1300)
SET(MSVC60 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 1)
ENDIF("${compilerVersion}" LESS 1300)
IF("${compilerVersion}" EQUAL 1300)
SET(MSVC70 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0)
ENDIF("${compilerVersion}" EQUAL 1300)
IF("${compilerVersion}" EQUAL 1310)
SET(MSVC71 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0)
ENDIF("${compilerVersion}" EQUAL 1310)
IF("${compilerVersion}" EQUAL 1400)
SET(MSVC80 1)
SET(CMAKE_COMPILER_2005 1)
ENDIF("${compilerVersion}" EQUAL 1400)
IF("${compilerVersion}" EQUAL 1500)
SET(MSVC90 1)
ENDIF("${compilerVersion}" EQUAL 1500)
IF("${compilerVersion}" EQUAL 1600)
SET(MSVC10 1)
ENDIF("${compilerVersion}" EQUAL 1600)
SET(MSVC_VERSION "${compilerVersion}")
ELSE(NOT CMAKE_COMPILER_RETURN)
MESSAGE(STATUS "Check for CL compiler version - failed")
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining the version of compiler failed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
ENDIF(NOT CMAKE_COMPILER_RETURN)
# try to figure out if we are running the free command line
# tools from Microsoft. These tools do not provide debug libraries,
# so the link flags used have to be different.
MAKE_DIRECTORY("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp2")
SET(testForFreeVCFile
"${CMAKE_ROOT}/Modules/CMakeTestForFreeVC.cxx")
STRING(REGEX REPLACE "/" "\\\\" testForFreeVCFile "${testForFreeVCFile}")
MESSAGE(STATUS "Check if this is a free VC compiler")
EXEC_PROGRAM(${CMAKE_TEST_COMPILER} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp2
ARGS /nologo /EHsc
\"${testForFreeVCFile}\"
OUTPUT_VARIABLE CMAKE_COMPILER_OUTPUT
RETURN_VALUE CMAKE_COMPILER_RETURN
)
IF(CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if this is a free VC compiler failed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
MESSAGE(STATUS "Check if this is a free VC compiler - yes")
SET(CMAKE_USING_VC_FREE_TOOLS 1)
ELSE(CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining if this is a free VC compiler passed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
MESSAGE(STATUS "Check if this is a free VC compiler - no")
SET(CMAKE_USING_VC_FREE_TOOLS 0)
ENDIF(CMAKE_COMPILER_RETURN)
MAKE_DIRECTORY("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp3")
ENDIF(NOT CMAKE_VC_COMPILER_TESTS_RUN)
ENDIF(CMAKE_GENERATOR MATCHES "Makefiles")
IF(MSVC_C_ARCHITECTURE_ID MATCHES 64)
SET(CMAKE_CL_64 1)
ELSE(MSVC_C_ARCHITECTURE_ID MATCHES 64)
SET(CMAKE_CL_64 0)
ENDIF(MSVC_C_ARCHITECTURE_ID MATCHES 64)
IF(CMAKE_FORCE_WIN64)
SET(CMAKE_CL_64 1)
ENDIF(CMAKE_FORCE_WIN64)
#IF("${MSVC_VERSION}" GREATER 1599)
# SET(MSVC_INCREMENTAL_DEFAULT ON)
#ENDIF()
# No support for old versions
if(MSVC_VERSION LESS 1310)
message(FATAL_ERROR "Your compiler is too old. Get a newer version!")
endif()
# for 2005 make sure the manifest is put in the dll with mt
#SET(CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_COMMAND> -E vs_link_dll ${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
#SET(CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_COMMAND> -E vs_link_dll ${CMAKE_CXX_CREATE_SHARED_MODULE}")
# create a C shared library
#SET(CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
# create a C shared module just copy the shared library rule
#SET(CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE}")
#SET(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_COMMAND> -E vs_link_exe ${CMAKE_CXX_LINK_EXECUTABLE}")
#SET(CMAKE_C_LINK_EXECUTABLE "<CMAKE_COMMAND> -E vs_link_exe ${CMAKE_C_LINK_EXECUTABLE}")
SET(CMAKE_BUILD_TYPE_INIT Debug)
SET(CMAKE_CXX_FLAGS_DEBUG_INIT "/D_DEBUG /Zi /Ob0 /Od")
SET(CMAKE_C_FLAGS_DEBUG_INIT "/D_DEBUG /Zi /Ob0 /Od")
SET(CMAKE_CXX_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc")
SET(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/O1 /Ob1 /D NDEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE_INIT "/O2 /Ob2 /D NDEBUG")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/Zi /O2 /Ob1")
SET(CMAKE_C_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000")
SET(CMAKE_C_FLAGS_MINSIZEREL_INIT "/O1 /Ob1 /D NDEBUG")
SET(CMAKE_C_FLAGS_RELEASE_INIT "/O2 /Ob2 /D NDEBUG")
SET(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/Zi /O2 /Ob1")
SET(CMAKE_C_STANDARD_LIBRARIES_INIT "")
SET(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}")
SET(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}")
# executable linker flags
SET (CMAKE_LINK_DEF_FILE_FLAG "/DEF:")
# set the stack size and the machine type
SET(_MACHINE_ARCH_FLAG ${MSVC_C_ARCHITECTURE_ID})
IF(NOT _MACHINE_ARCH_FLAG)
SET(_MACHINE_ARCH_FLAG ${MSVC_CXX_ARCHITECTURE_ID})
ENDIF(NOT _MACHINE_ARCH_FLAG)
SET (CMAKE_EXE_LINKER_FLAGS_INIT
"${CMAKE_EXE_LINKER_FLAGS_INIT} /STACK:10000000 /machine:${_MACHINE_ARCH_FLAG}")
# add /debug and /INCREMENTAL:YES to DEBUG and RELWITHDEBINFO also add pdbtype
# on versions that support it
SET( MSVC_INCREMENTAL_YES_FLAG "")
IF(NOT MSVC_INCREMENTAL_DEFAULT)
SET( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL:YES")
ENDIF()
IF (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
SET (CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "/debug /pdbtype:sept")
SET (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug /pdbtype:sept ${MSVC_INCREMENTAL_YES_FLAG}")
ELSE (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
SET (CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "/debug")
SET (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug ${MSVC_INCREMENTAL_YES_FLAG}")
ENDIF (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
# for release and minsize release default to no incremental linking
SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT "/INCREMENTAL:NO")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "/INCREMENTAL:NO")
# copy the EXE_LINKER flags to SHARED and MODULE linker flags
# shared linker flags
SET (CMAKE_SHARED_LINKER_FLAGS_INIT ${CMAKE_EXE_LINKER_FLAGS_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT ${CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT})
# module linker flags
SET (CMAKE_MODULE_LINKER_FLAGS_INIT ${CMAKE_SHARED_LINKER_FLAGS_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_DEBUG_INIT ${CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT})
# save computed information for this platform
IF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake")
CONFIGURE_FILE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCPlatform.cmake IMMEDIATE)
ENDIF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake")
IF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake")
CONFIGURE_FILE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCXXPlatform.cmake IMMEDIATE)
ENDIF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake")
# try to load any previously computed information for C on this platform
INCLUDE( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake OPTIONAL)
# try to load any previously computed information for CXX on this platform
INCLUDE( ${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake OPTIONAL)
SET(WIN32 1)
INCLUDE(Platform/cl)
############
# Detect WDK build environment
IF($ENV{DDKBUILDENV} MATCHES "chk")
MESSAGE(STATUS "DDK/WDK checked build environment detected.")
SET(CMAKE_USE_WDK_ENV 1)
ENDIF()
IF($ENV{DDKBUILDENV} MATCHES "fre")
MESSAGE(STATUS "DDK/WDK free build environment detected.")
SET(CMAKE_USE_WDK_ENV 1)
ENDIF()
if(CMAKE_USE_WDK_ENV)
# Detect output architecture
if(NOT ARCH)
if($ENV{AMD64} MATCHES 1)
set(ARCH amd64)
set(MSVC_C_ARCHITECTURE_ID 64)
else()
set(ARCH i386)
endif()
endif()
# Add library directories
STRING(REPLACE * ${ARCH} ATL_LIB_PATH $ENV{ATL_LIB_PATH})
STRING(REPLACE * ${ARCH} CRT_LIB_PATH $ENV{CRT_LIB_PATH})
STRING(REPLACE * ${ARCH} DDK_LIB_PATH $ENV{DDK_LIB_PATH})
STRING(REPLACE * ${ARCH} KMDF_LIB_PATH $ENV{KMDF_LIB_PATH})
STRING(REPLACE * ${ARCH} MFC_LIB_PATH $ENV{MFC_LIB_PATH})
STRING(REPLACE * ${ARCH} SDK_LIB_PATH $ENV{SDK_LIB_PATH})
LINK_DIRECTORIES(${ATL_LIB_PATH}
${CRT_LIB_PATH}
${DDK_LIB_PATH}
${IFSKIT_LIB_PATH}
${KMDF_LIB_PATH}
${MFC_LIB_PATH}
${SDK_LIB_PATH})
# Add environment variables
if(NOT CMAKE_CROSSCOMPILING)
set(ENV{INCLUDE} "$ENV{CRT_INC_PATH};$ENV{SDK_INC_PATH};$ENV{SDK_INC_PATH}\\crt\\stl60")
include_directories($ENV{INCLUDE})
set(ENV{LIBPATH} "${CRT_LIB_PATH};${SDK_LIB_PATH}")
set(ENV{USE_MSVCRT} 1)
set(ENV{USE_STL} 1)
set(ENV{STL_VER} 60)
endif()
endif()
############
SET(CMAKE_CREATE_WIN32_EXE /subsystem:windows)
SET(CMAKE_CREATE_CONSOLE_EXE /subsystem:console)
IF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
SET (CMAKE_NO_BUILD_TYPE 1)
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 6")
IF(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio")
SET (CMAKE_NO_BUILD_TYPE 1)
SET (CMAKE_CONFIGURATION_TYPES "Debug;Release;MinSizeRel;RelWithDebInfo" CACHE STRING
"Semicolon separated list of supported configuration types, only supports Debug, Release, MinSizeRel, and RelWithDebInfo, anything else will be ignored.")
MARK_AS_ADVANCED(CMAKE_CONFIGURATION_TYPES)
ENDIF(NOT CMAKE_NO_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio")
# does the compiler support pdbtype and is it the newer compiler
IF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
SET(CMAKE_COMPILER_2005 1)
ENDIF(CMAKE_GENERATOR MATCHES "Visual Studio 8")
# make sure to enable languages after setting configuration types
ENABLE_LANGUAGE(RC)
SET(CMAKE_COMPILE_RESOURCE "rc <FLAGS> /fo<OBJECT> <SOURCE>")
# for nmake we need to compute some information about the compiler
# that is being used.
# the compiler may be free command line, 6, 7, or 71, and
# each have properties that must be determined.
# to avoid running these tests with each cmake run, the
# test results are saved in CMakeCPlatform.cmake, a file
# that is automatically copied into try_compile directories
# by the global generator.
SET(MSVC_IDE 1)
IF(CMAKE_GENERATOR MATCHES "Makefiles")
SET(MSVC_IDE 0)
IF(NOT CMAKE_VC_COMPILER_TESTS_RUN)
SET(CMAKE_VC_COMPILER_TESTS 1)
SET(testNmakeCLVersionFile
"${CMAKE_ROOT}/Modules/CMakeTestNMakeCLVersion.c")
STRING(REGEX REPLACE "/" "\\\\" testNmakeCLVersionFile "${testNmakeCLVersionFile}")
MESSAGE(STATUS "Check for CL compiler version")
SET(CMAKE_TEST_COMPILER ${CMAKE_C_COMPILER})
IF (NOT CMAKE_C_COMPILER)
SET(CMAKE_TEST_COMPILER ${CMAKE_CXX_COMPILER})
ENDIF(NOT CMAKE_C_COMPILER)
EXEC_PROGRAM(${CMAKE_TEST_COMPILER}
ARGS /nologo -EP \"${testNmakeCLVersionFile}\"
OUTPUT_VARIABLE CMAKE_COMPILER_OUTPUT
RETURN_VALUE CMAKE_COMPILER_RETURN
)
IF(NOT CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining the version of compiler passed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
STRING(REGEX REPLACE "\n" " " compilerVersion "${CMAKE_COMPILER_OUTPUT}")
STRING(REGEX REPLACE ".*VERSION=(.*)" "\\1"
compilerVersion "${compilerVersion}")
MESSAGE(STATUS "Check for CL compiler version - ${compilerVersion}")
SET(MSVC60)
SET(MSVC70)
SET(MSVC71)
SET(MSVC80)
SET(CMAKE_COMPILER_2005)
IF("${compilerVersion}" LESS 1300)
SET(MSVC60 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 1)
ENDIF("${compilerVersion}" LESS 1300)
IF("${compilerVersion}" EQUAL 1300)
SET(MSVC70 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0)
ENDIF("${compilerVersion}" EQUAL 1300)
IF("${compilerVersion}" EQUAL 1310)
SET(MSVC71 1)
SET(CMAKE_COMPILER_SUPPORTS_PDBTYPE 0)
ENDIF("${compilerVersion}" EQUAL 1310)
IF("${compilerVersion}" EQUAL 1400)
SET(MSVC80 1)
SET(CMAKE_COMPILER_2005 1)
ENDIF("${compilerVersion}" EQUAL 1400)
IF("${compilerVersion}" EQUAL 1500)
SET(MSVC90 1)
ENDIF("${compilerVersion}" EQUAL 1500)
IF("${compilerVersion}" EQUAL 1600)
SET(MSVC10 1)
ENDIF("${compilerVersion}" EQUAL 1600)
SET(MSVC_VERSION "${compilerVersion}")
ELSE(NOT CMAKE_COMPILER_RETURN)
MESSAGE(STATUS "Check for CL compiler version - failed")
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining the version of compiler failed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
ENDIF(NOT CMAKE_COMPILER_RETURN)
# try to figure out if we are running the free command line
# tools from Microsoft. These tools do not provide debug libraries,
# so the link flags used have to be different.
MAKE_DIRECTORY("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp2")
SET(testForFreeVCFile
"${CMAKE_ROOT}/Modules/CMakeTestForFreeVC.cxx")
STRING(REGEX REPLACE "/" "\\\\" testForFreeVCFile "${testForFreeVCFile}")
MESSAGE(STATUS "Check if this is a free VC compiler")
EXEC_PROGRAM(${CMAKE_TEST_COMPILER} ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp2
ARGS /nologo /EHsc
\"${testForFreeVCFile}\"
OUTPUT_VARIABLE CMAKE_COMPILER_OUTPUT
RETURN_VALUE CMAKE_COMPILER_RETURN
)
IF(CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if this is a free VC compiler failed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
MESSAGE(STATUS "Check if this is a free VC compiler - yes")
SET(CMAKE_USING_VC_FREE_TOOLS 1)
ELSE(CMAKE_COMPILER_RETURN)
FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining if this is a free VC compiler passed with the following output:\n"
"${CMAKE_COMPILER_OUTPUT}\n\n")
MESSAGE(STATUS "Check if this is a free VC compiler - no")
SET(CMAKE_USING_VC_FREE_TOOLS 0)
ENDIF(CMAKE_COMPILER_RETURN)
MAKE_DIRECTORY("${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp3")
ENDIF(NOT CMAKE_VC_COMPILER_TESTS_RUN)
ENDIF(CMAKE_GENERATOR MATCHES "Makefiles")
IF(MSVC_C_ARCHITECTURE_ID MATCHES 64)
SET(CMAKE_CL_64 1)
ELSE(MSVC_C_ARCHITECTURE_ID MATCHES 64)
SET(CMAKE_CL_64 0)
ENDIF(MSVC_C_ARCHITECTURE_ID MATCHES 64)
IF(CMAKE_FORCE_WIN64)
SET(CMAKE_CL_64 1)
ENDIF(CMAKE_FORCE_WIN64)
#IF("${MSVC_VERSION}" GREATER 1599)
# SET(MSVC_INCREMENTAL_DEFAULT ON)
#ENDIF()
# No support for old versions
if(MSVC_VERSION LESS 1310)
message(FATAL_ERROR "Your compiler is too old. Get a newer version!")
endif()
# for 2005 make sure the manifest is put in the dll with mt
#SET(CMAKE_CXX_CREATE_SHARED_LIBRARY "<CMAKE_COMMAND> -E vs_link_dll ${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
#SET(CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_COMMAND> -E vs_link_dll ${CMAKE_CXX_CREATE_SHARED_MODULE}")
# create a C shared library
#SET(CMAKE_C_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY}")
# create a C shared module just copy the shared library rule
#SET(CMAKE_C_CREATE_SHARED_MODULE "${CMAKE_CXX_CREATE_SHARED_MODULE}")
#SET(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_COMMAND> -E vs_link_exe ${CMAKE_CXX_LINK_EXECUTABLE}")
#SET(CMAKE_C_LINK_EXECUTABLE "<CMAKE_COMMAND> -E vs_link_exe ${CMAKE_C_LINK_EXECUTABLE}")
SET(CMAKE_BUILD_TYPE_INIT Debug)
SET(CMAKE_CXX_FLAGS_DEBUG_INIT "/Zi /Ob0 /Od")
SET(CMAKE_C_FLAGS_DEBUG_INIT "/Zi /Ob0 /Od")
SET(CMAKE_CXX_FLAGS_INIT "")
SET(CMAKE_CXX_FLAGS_MINSIZEREL_INIT "/O1 /Ob1 /D NDEBUG")
SET(CMAKE_CXX_FLAGS_RELEASE_INIT "/O2 /Ob2 /D NDEBUG")
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO_INIT "/Zi /O2 /Ob1")
SET(CMAKE_C_FLAGS_INIT "")
SET(CMAKE_C_FLAGS_MINSIZEREL_INIT "/O1 /Ob1 /D NDEBUG")
SET(CMAKE_C_FLAGS_RELEASE_INIT "/O2 /Ob2 /D NDEBUG")
SET(CMAKE_C_FLAGS_RELWITHDEBINFO_INIT "/Zi /O2 /Ob1")
SET(CMAKE_C_STANDARD_LIBRARIES_INIT "")
SET(CMAKE_EXE_LINKER_FLAGS_INIT "${CMAKE_EXE_LINKER_FLAGS_INIT}")
SET(CMAKE_CXX_STANDARD_LIBRARIES_INIT "${CMAKE_C_STANDARD_LIBRARIES_INIT}")
# executable linker flags
SET (CMAKE_LINK_DEF_FILE_FLAG "/DEF:")
# set the stack size and the machine type
SET(_MACHINE_ARCH_FLAG ${MSVC_C_ARCHITECTURE_ID})
IF(NOT _MACHINE_ARCH_FLAG)
SET(_MACHINE_ARCH_FLAG ${MSVC_CXX_ARCHITECTURE_ID})
ENDIF(NOT _MACHINE_ARCH_FLAG)
SET (CMAKE_EXE_LINKER_FLAGS_INIT
"${CMAKE_EXE_LINKER_FLAGS_INIT} /STACK:10000000 /machine:${_MACHINE_ARCH_FLAG}")
# add /debug and /INCREMENTAL:YES to DEBUG and RELWITHDEBINFO also add pdbtype
# on versions that support it
SET( MSVC_INCREMENTAL_YES_FLAG "")
IF(NOT MSVC_INCREMENTAL_DEFAULT)
SET( MSVC_INCREMENTAL_YES_FLAG "/INCREMENTAL:YES")
ENDIF()
IF (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
SET (CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "/debug /pdbtype:sept")
SET (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug /pdbtype:sept ${MSVC_INCREMENTAL_YES_FLAG}")
ELSE (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
SET (CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT "/debug")
SET (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT "/debug ${MSVC_INCREMENTAL_YES_FLAG}")
ENDIF (CMAKE_COMPILER_SUPPORTS_PDBTYPE)
# for release and minsize release default to no incremental linking
SET(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT "/INCREMENTAL:NO")
SET(CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT "/INCREMENTAL:NO")
# copy the EXE_LINKER flags to SHARED and MODULE linker flags
# shared linker flags
SET (CMAKE_SHARED_LINKER_FLAGS_INIT ${CMAKE_EXE_LINKER_FLAGS_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT ${CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT})
SET (CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT})
# module linker flags
SET (CMAKE_MODULE_LINKER_FLAGS_INIT ${CMAKE_SHARED_LINKER_FLAGS_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_DEBUG_INIT ${CMAKE_SHARED_LINKER_FLAGS_DEBUG_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO_INIT ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_RELEASE_INIT ${CMAKE_EXE_LINKER_FLAGS_RELEASE_INIT})
SET (CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL_INIT ${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL_INIT})
# save computed information for this platform
IF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake")
CONFIGURE_FILE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCPlatform.cmake IMMEDIATE)
ENDIF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCPlatform.cmake")
IF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake")
CONFIGURE_FILE(${CMAKE_ROOT}/Modules/Platform/Windows-cl.cmake.in
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeCXXPlatform.cmake IMMEDIATE)
ENDIF(NOT EXISTS "${CMAKE_PLATFORM_ROOT_BIN}/CMakeCXXPlatform.cmake")
+36 -36
View File
@@ -1,36 +1,36 @@
SET(WIN32 1)
SET(CMAKE_STATIC_LIBRARY_PREFIX "")
SET(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
SET(CMAKE_SHARED_LIBRARY_PREFIX "") # lib
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dll") # .so
SET(CMAKE_IMPORT_LIBRARY_PREFIX "")
SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".lib")
SET(CMAKE_EXECUTABLE_SUFFIX ".exe") # .exe
SET(CMAKE_LINK_LIBRARY_SUFFIX ".lib")
SET(CMAKE_DL_LIBS "")
SET(CMAKE_FIND_LIBRARY_PREFIXES "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
# for borland make long command lines are redirected to a file
# with the following syntax, see Windows-bcc32.cmake for use
IF(CMAKE_GENERATOR MATCHES "Borland")
SET(CMAKE_START_TEMP_FILE "@&&|\n")
SET(CMAKE_END_TEMP_FILE "\n|")
ENDIF(CMAKE_GENERATOR MATCHES "Borland")
# for nmake make long command lines are redirected to a file
# with the following syntax, see Windows-bcc32.cmake for use
IF(CMAKE_GENERATOR MATCHES "NMake")
# SET(CMAKE_START_TEMP_FILE "@<<\n")
# SET(CMAKE_END_TEMP_FILE "\n<<")
ENDIF(CMAKE_GENERATOR MATCHES "NMake")
INCLUDE(Platform/WindowsPaths)
# uncomment these out to debug nmake and borland makefiles
SET(CMAKE_START_TEMP_FILE "")
SET(CMAKE_END_TEMP_FILE "")
#SET(CMAKE_VERBOSE_MAKEFILE 1)
SET(WIN32 1)
SET(CMAKE_STATIC_LIBRARY_PREFIX "")
SET(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
SET(CMAKE_SHARED_LIBRARY_PREFIX "") # lib
SET(CMAKE_SHARED_LIBRARY_SUFFIX ".dll") # .so
SET(CMAKE_IMPORT_LIBRARY_PREFIX "")
SET(CMAKE_IMPORT_LIBRARY_SUFFIX ".lib")
SET(CMAKE_EXECUTABLE_SUFFIX ".exe") # .exe
SET(CMAKE_LINK_LIBRARY_SUFFIX ".lib")
SET(CMAKE_DL_LIBS "")
SET(CMAKE_FIND_LIBRARY_PREFIXES "")
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
# for borland make long command lines are redirected to a file
# with the following syntax, see Windows-bcc32.cmake for use
IF(CMAKE_GENERATOR MATCHES "Borland")
SET(CMAKE_START_TEMP_FILE "@&&|\n")
SET(CMAKE_END_TEMP_FILE "\n|")
ENDIF(CMAKE_GENERATOR MATCHES "Borland")
# for nmake make long command lines are redirected to a file
# with the following syntax, see Windows-bcc32.cmake for use
IF(CMAKE_GENERATOR MATCHES "NMake")
# SET(CMAKE_START_TEMP_FILE "@<<\n")
# SET(CMAKE_END_TEMP_FILE "\n<<")
ENDIF(CMAKE_GENERATOR MATCHES "NMake")
INCLUDE(Platform/WindowsPaths)
# uncomment these out to debug nmake and borland makefiles
SET(CMAKE_START_TEMP_FILE "")
SET(CMAKE_END_TEMP_FILE "")
#SET(CMAKE_VERBOSE_MAKEFILE 1)
+43 -43
View File
@@ -1,43 +1,43 @@
set(SARCH "" CACHE STRING
"Sub-architecture to build for.")
set(OARCH "athlon64" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
k8 opteron athlon64 athlon-fx")
set (OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(USERMODE TRUE CACHE BOOL
"Whether to compile any usermode parts. This is while kernel mode is under
heavy development and usermode part not relevant for bootcd.")
set(SARCH "" CACHE STRING
"Sub-architecture to build for.")
set(OARCH "athlon64" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
k8 opteron athlon64 athlon-fx")
set (OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(USERMODE TRUE CACHE BOOL
"Whether to compile any usermode parts. This is while kernel mode is under
heavy development and usermode part not relevant for bootcd.")
+46 -46
View File
@@ -1,46 +1,46 @@
set(SARCH "omap3-zoom2" CACHE STRING
"Sub-architecture (board) to build for. Specify one of:
kurobox versatile omap3-zoom2 omap3-beagle")
set(OARCH "armv7-a" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
armv5te armv7-a")
set (OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(BUILD_MP TRUE CACHE BOOL
"Whether to compile the multi processor versions for ntoskrnl and hal.")
set(NEWSPRINTF FALSE CACHE BOOL
"Whether to compile the new sprintf.")
set(SARCH "omap3-zoom2" CACHE STRING
"Sub-architecture (board) to build for. Specify one of:
kurobox versatile omap3-zoom2 omap3-beagle")
set(OARCH "armv7-a" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
armv5te armv7-a")
set (OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(BUILD_MP TRUE CACHE BOOL
"Whether to compile the multi processor versions for ntoskrnl and hal.")
set(NEWSPRINTF FALSE CACHE BOOL
"Whether to compile the new sprintf.")
+57 -57
View File
@@ -1,57 +1,57 @@
set(SARCH "pc" CACHE STRING
"Sub-architecture to build for. Specify one of: xbox")
set(OARCH "pentium" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
native, i386, i486, pentium, pentium-mmx, pentiumpro, i686,
pentium2, pentium3, pentium-m, pentium4, prescott, nocona,
core2, k6, k6-2, athlon, athlon-xp, opteron, opteron-sse3,
barcelona, winchip-c6, winchip2, c3, c3-2, geode")
set(TUNE "i686" CACHE STRING
"Which CPU ReactOS should be optimized for.")
set(OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
if(MSVC)
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
else()
set(KDBG TRUE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(_WINKD_ FALSE CACHE BOOL
"Whether to compile with the KD protocol.")
endif()
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(BUILD_MP TRUE CACHE BOOL
"Whether to compile the multi processor versions for ntoskrnl and hal.")
set(GENERATE_DEPENDENCY_GRAPH FALSE CACHE BOOL
"Whether to create a graphml dependency of dlls.")
set(SARCH "pc" CACHE STRING
"Sub-architecture to build for. Specify one of: xbox")
set(OARCH "pentium" CACHE STRING
"Generate instructions for this CPU type. Specify one of:
native, i386, i486, pentium, pentium-mmx, pentiumpro, i686,
pentium2, pentium3, pentium-m, pentium4, prescott, nocona,
core2, k6, k6-2, athlon, athlon-xp, opteron, opteron-sse3,
barcelona, winchip-c6, winchip2, c3, c3-2, geode")
set(TUNE "i686" CACHE STRING
"Which CPU ReactOS should be optimized for.")
set(OPTIMIZE "1" CACHE STRING
"What level of optimisation to use.
0 = off
1 = Default option, optimize for size (-Os) with some additional options
2 = -Os
3 = -O1
4 = -O2
5 = -O3")
set(GDB FALSE CACHE BOOL
"Whether to compile for debugging with GDB.
If you don't use GDB, don't enable this.")
set(DBG TRUE CACHE BOOL
"Whether to compile for debugging.")
if(MSVC)
set(KDBG FALSE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(_WINKD_ TRUE CACHE BOOL
"Whether to compile with the KD protocol.")
else()
set(KDBG TRUE CACHE BOOL
"Whether to compile in the integrated kernel debugger.")
set(_WINKD_ FALSE CACHE BOOL
"Whether to compile with the KD protocol.")
endif()
set(_ELF_ FALSE CACHE BOOL
"Whether to compile support for ELF files.
Do not enable unless you know what you're doing.")
set(NSWPAT FALSE CACHE BOOL
"Whether to compile apps/libs with features covered software patents or not.
If you live in a country where software patents are valid/apply, don't
enable this (except they/you purchased a license from the patent owner).
This settings is disabled (0) by default.")
set(BUILD_MP TRUE CACHE BOOL
"Whether to compile the multi processor versions for ntoskrnl and hal.")
set(GENERATE_DEPENDENCY_GRAPH FALSE CACHE BOOL
"Whether to create a graphml dependency of dlls.")
-2
View File
@@ -11,8 +11,6 @@
/* FIXME guid mess */
#ifndef _MSC_VER
const GUID IID_IUnknown = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
#else
const GUID IID_IKsDataTypeHandler = {0x5FFBAA02L, 0x49A3, 0x11D0, {0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1}};
#endif
const GUID IID_IClassFactory = {0x00000001, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}};
+2 -4
View File
@@ -10,10 +10,8 @@
const GUID IID_IKsPinPipe = {0xe539cd90, 0xa8b4, 0x11d1, {0x81, 0x89, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02}};
const GUID IID_IKsPinEx = {0x7bb38260L, 0xd19c, 0x11d2, {0xb3, 0x8a, 0x00, 0xa0, 0xc9, 0x5e, 0xc2, 0x2e}};
#ifdef _MSC_VER
const GUID IID_IKsPin = {0xb61178d1L, 0xa2d9, 0x11cf, {0x9e, 0x53, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
const GUID IID_IKsInterfaceHandler = {0xD3ABC7E0L, 0x9A61, 0x11D0, {0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
#endif
#ifndef _MSC_VER
const GUID KSPROPSETID_Connection = {0x1D58C920L, 0xAC9B, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}};
-2
View File
@@ -10,8 +10,6 @@
const GUID IID_IKsObject = {0x423c13a2, 0x2070, 0x11d0, {0x9e, 0xf7, 0x00, 0xaa, 0x00, 0xa2, 0x16, 0xa1}};
extern const GUID IID_IKsInterfaceHandler;
class CKsInterfaceHandler : public IKsInterfaceHandler
{
public:
+1 -2
View File
@@ -16,13 +16,12 @@ const GUID CLSID_KsQualityForwarder = {0xe05592e4, 0xc0b5, 0x11d0, {0
#ifndef _MSC_VER
const GUID CLSID_KsIBasicAudioInterfaceHandler = {0xb9f8ac3e, 0x0f71, 0x11d2, {0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d}};
const GUID KSPROPSETID_Pin = {0x8C134960, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}};
const GUID KSINTERFACESETID_Standard = {STATIC_KSINTERFACESETID_Standard};
const GUID CLSID_Proxy = {0x17CCA71B, 0xECD7, 0x11D0, {0xB9, 0x08, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}};
#endif
const GUID CLSID_KsIBasicAudioInterfaceHandler = {0xb9f8ac3e, 0x0f71, 0x11d2, {0xb7, 0x2c, 0x00, 0xc0, 0x4f, 0xb6, 0xbd, 0x3d}};
static INTERFACE_TABLE InterfaceTable[] =
{
{&MEDIATYPE_Audio, CKsDataTypeHandler_Constructor},
+1 -4
View File
@@ -8,9 +8,6 @@
*/
#include "precomp.h"
extern const GUID IID_IKsPin;
extern const GUID IID_IKsInterfaceHandler;
class COutputPin : public IPin,
public IKsObject,
public IKsPropertySet,
@@ -1684,7 +1681,7 @@ COutputPin::Connect(IPin *pReceivePin, const AM_MEDIA_TYPE *pmt)
if (GetSupportedSets(&pGuid, &NumGuids))
{
// load all proxy plugins
if (FAILED(LoadProxyPlugins(pGuid, NumGuids)))
if (FAILED(LoadProxyPlugins(pGuid, NumGuids)));
{
#ifdef KSPROXY_TRACE
OutputDebugStringW(L"COutputPin::Connect LoadProxyPlugins failed\n");
+4 -4
View File
@@ -26,7 +26,7 @@
@ stdcall D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr) d3dx9_36.D3DXConcatenateMeshes
@ stdcall D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToSingleStrip
@ stdcall D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr) d3dx9_36.D3DXConvertMeshSubsetToStrips
@ stdcall -stub D3DXCpuOptimizations(long)
@ stub D3DXCpuOptimizations
@ stdcall D3DXCreateAnimationController(long long long long ptr) d3dx9_36.D3DXCreateAnimationController
@ stdcall D3DXCreateBox(ptr long long long ptr ptr) d3dx9_36.D3DXCreateBox
@ stdcall D3DXCreateBuffer(long ptr) d3dx9_36.D3DXCreateBuffer
@@ -159,8 +159,8 @@
@ stdcall D3DXGetShaderSamplers(ptr ptr ptr) d3dx9_36.D3DXGetShaderSamplers
@ stdcall D3DXGetShaderSize(ptr) d3dx9_36.D3DXGetShaderSize
@ stdcall D3DXGetShaderVersion(ptr) d3dx9_36.D3DXGetShaderVersion
@ stdcall -stub D3DXGetTargetDescByName(long long long)
@ stdcall -stub D3DXGetTargetDescByVersion(long long long)
@ stub D3DXGetTargetDescByName
@ stub D3DXGetTargetDescByVersion
@ stdcall D3DXGetVertexShaderProfile(ptr) d3dx9_36.D3DXGetVertexShaderProfile
@ stdcall D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersect
@ stdcall D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr) d3dx9_36.D3DXIntersectSubset
@@ -185,7 +185,7 @@
@ stdcall D3DXLoadSurfaceFromMemory(ptr ptr ptr ptr long long ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromMemory
@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceA
@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr long ptr ptr long long ptr) d3dx9_36.D3DXLoadSurfaceFromResourceW
@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long) d3dx9_36.D3DXLoadSurfaceFromSurface
@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long) d3dx9_36.D3DXLoadSurfaceFromSurface
@ stdcall D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileA
@ stdcall D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileInMemory
@ stdcall D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr) d3dx9_36.D3DXLoadVolumeFromFileW
+191 -191
View File
@@ -4,150 +4,150 @@
@ stdcall D3DXAssembleShaderFromResourceA(long str ptr ptr long ptr ptr)
@ stdcall D3DXAssembleShaderFromResourceW(long wstr ptr ptr long ptr ptr)
@ stdcall D3DXBoxBoundProbe(ptr ptr ptr ptr)
@ stdcall -stub D3DXCheckCubeTextureRequirements(ptr ptr ptr long ptr long)
@ stdcall -stub D3DXCheckTextureRequirements(ptr ptr ptr ptr long ptr long)
@ stub D3DXCheckCubeTextureRequirements
@ stub D3DXCheckTextureRequirements
@ stdcall D3DXCheckVersion(long long)
@ stdcall -stub D3DXCheckVolumeTextureRequirements(ptr ptr ptr ptr ptr long ptr long)
@ stdcall -stub D3DXCleanMesh(ptr ptr ptr ptr ptr)
@ stub D3DXCheckVolumeTextureRequirements
@ stub D3DXCleanMesh
@ stdcall D3DXColorAdjustContrast(ptr ptr long)
@ stdcall D3DXColorAdjustSaturation(ptr ptr long)
@ stdcall D3DXCompileShader(ptr long ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCompileShaderFromFileA(ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCompileShaderFromFileW(ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCompileShaderFromResourceA(long ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCompileShaderFromResourceW(long ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stub D3DXCompileShaderFromFileA
@ stub D3DXCompileShaderFromFileW
@ stub D3DXCompileShaderFromResourceA
@ stub D3DXCompileShaderFromResourceW
@ stdcall D3DXComputeBoundingBox(ptr long long ptr ptr)
@ stdcall D3DXComputeBoundingSphere(ptr long long ptr ptr)
@ stub D3DXComputeIMTFromPerTexelSignal
@ stub D3DXComputeIMTFromPerVertexSignal
@ stub D3DXComputeIMTFromSignal
@ stub D3DXComputeIMTFromTexture
@ stdcall -stub D3DXComputeNormalMap(ptr ptr ptr long long long)
@ stdcall -stub D3DXComputeNormals(ptr ptr)
@ stdcall -stub D3DXComputeTangent(ptr long long long long ptr)
@ stdcall -stub D3DXComputeTangentFrame(ptr long)
@ stdcall -stub D3DXComputeTangentFrameEx(ptr long long long long long long long long long ptr long long long ptr ptr)
@ stdcall -stub D3DXConcatenateMeshes(ptr long long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXConvertMeshSubsetToSingleStrip(ptr long long ptr ptr)
@ stdcall -stub D3DXConvertMeshSubsetToStrips(ptr long long ptr ptr ptr ptr)
@ stdcall -stub D3DXCreateAnimationController(long long long long ptr)
@ stdcall -stub D3DXCreateBox(ptr long long long ptr ptr)
@ stub D3DXComputeNormalMap
@ stub D3DXComputeNormals
@ stub D3DXComputeTangent
@ stub D3DXComputeTangentFrame
@ stub D3DXComputeTangentFrameEx
@ stub D3DXConcatenateMeshes
@ stub D3DXConvertMeshSubsetToSingleStrip
@ stub D3DXConvertMeshSubsetToStrips
@ stub D3DXCreateAnimationController
@ stub D3DXCreateBox
@ stdcall D3DXCreateBuffer(long ptr)
@ stdcall -stub D3DXCreateCompressedAnimationSet(ptr long long ptr long ptr ptr)
@ stdcall -stub D3DXCreateCubeTexture(ptr long long long long long ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileA(ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileExA(ptr ptr long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileExW(ptr ptr long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileInMemory(ptr ptr long ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromFileW(ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromResourceA(ptr long ptr ptr) d3dx9_36.D3DXCreateCubeTextureFromResourceA
@ stdcall -stub D3DXCreateCubeTextureFromResourceExA(ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromResourceExW(ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateCubeTextureFromResourceW(ptr long ptr ptr)
@ stdcall -stub D3DXCreateCylinder(ptr long long long long long ptr ptr)
@ stdcall -stub D3DXCreateEffect(ptr ptr long ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectCompiler(ptr long ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateEffectCompilerFromFileA(ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateEffectCompilerFromFileW(ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateEffectCompilerFromResourceA(long ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateEffectCompilerFromResourceW(long ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateEffectEx(ptr ptr long ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromFileA(ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromFileExA(ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromFileExW(ptr ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromFileW(ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromResourceA(ptr long ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromResourceExA(ptr long ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromResourceExW(ptr long ptr ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectFromResourceW(ptr long ptr ptr ptr long ptr ptr ptr)
@ stdcall -stub D3DXCreateEffectPool(ptr)
@ stub D3DXCreateCompressedAnimationSet
@ stub D3DXCreateCubeTexture
@ stub D3DXCreateCubeTextureFromFileA
@ stub D3DXCreateCubeTextureFromFileExA
@ stub D3DXCreateCubeTextureFromFileExW
@ stub D3DXCreateCubeTextureFromFileInMemory
@ stub D3DXCreateCubeTextureFromFileInMemoryEx
@ stub D3DXCreateCubeTextureFromFileW
@ stub D3DXCreateCubeTextureFromResourceA
@ stub D3DXCreateCubeTextureFromResourceExA
@ stub D3DXCreateCubeTextureFromResourceExW
@ stub D3DXCreateCubeTextureFromResourceW
@ stub D3DXCreateCylinder
@ stub D3DXCreateEffect
@ stub D3DXCreateEffectCompiler
@ stub D3DXCreateEffectCompilerFromFileA
@ stub D3DXCreateEffectCompilerFromFileW
@ stub D3DXCreateEffectCompilerFromResourceA
@ stub D3DXCreateEffectCompilerFromResourceW
@ stub D3DXCreateEffectEx
@ stub D3DXCreateEffectFromFileA
@ stub D3DXCreateEffectFromFileExA
@ stub D3DXCreateEffectFromFileExW
@ stub D3DXCreateEffectFromFileW
@ stub D3DXCreateEffectFromResourceA
@ stub D3DXCreateEffectFromResourceExA
@ stub D3DXCreateEffectFromResourceExW
@ stub D3DXCreateEffectFromResourceW
@ stub D3DXCreateEffectPool
@ stdcall D3DXCreateFontA(ptr long long long long long long long long long str ptr)
@ stdcall D3DXCreateFontIndirectA(ptr ptr ptr)
@ stdcall D3DXCreateFontIndirectW(ptr ptr ptr)
@ stdcall D3DXCreateFontW(ptr long long long long long long long long long wstr ptr)
@ stdcall -stub D3DXCreateFragmentLinker(ptr long ptr)
@ stub D3DXCreateFragmentLinker
@ stub D3DXCreateFragmentLinkerEx
@ stdcall -stub D3DXCreateKeyframedAnimationSet(ptr long long long long ptr ptr)
@ stdcall -stub D3DXCreateLine(ptr ptr)
@ stub D3DXCreateKeyframedAnimationSet
@ stub D3DXCreateLine
@ stdcall D3DXCreateMatrixStack(long ptr)
@ stdcall -stub D3DXCreateMesh(long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateMeshFVF(long long long long ptr ptr)
@ stdcall -stub D3DXCreateNPatchMesh(ptr ptr)
@ stdcall -stub D3DXCreatePMeshFromStream(ptr long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXCreatePatchMesh(ptr long long long ptr ptr ptr)
@ stdcall -stub D3DXCreatePolygon(ptr long long ptr ptr)
@ stdcall -stub D3DXCreatePRTBuffer(long long long ptr)
@ stdcall -stub D3DXCreatePRTBufferTex(long long long long ptr)
@ stdcall -stub D3DXCreatePRTCompBuffer(long long long ptr ptr ptr ptr)
@ stdcall -stub D3DXCreatePRTEngine(ptr ptr long ptr ptr)
@ stdcall -stub D3DXCreateRenderToEnvMap(ptr long long long long long ptr)
@ stdcall -stub D3DXCreateRenderToSurface(ptr long long long long long ptr)
@ stdcall -stub D3DXCreateSPMesh(ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXCreateSkinInfo(long ptr long ptr)
@ stdcall -stub D3DXCreateSkinInfoFromBlendedMesh(ptr long ptr ptr)
@ stdcall -stub D3DXCreateSkinInfoFVF(long long long ptr)
@ stdcall -stub D3DXCreateSphere(ptr long long long ptr ptr)
@ stub D3DXCreateMesh
@ stub D3DXCreateMeshFVF
@ stub D3DXCreateNPatchMesh
@ stub D3DXCreatePMeshFromStream
@ stub D3DXCreatePatchMesh
@ stub D3DXCreatePolygon
@ stub D3DXCreatePRTBuffer
@ stub D3DXCreatePRTBufferTex
@ stub D3DXCreatePRTCompBuffer
@ stub D3DXCreatePRTEngine
@ stub D3DXCreateRenderToEnvMap
@ stub D3DXCreateRenderToSurface
@ stub D3DXCreateSPMesh
@ stub D3DXCreateSkinInfo
@ stub D3DXCreateSkinInfoFromBlendedMesh
@ stub D3DXCreateSkinInfoFVF
@ stub D3DXCreateSphere
@ stdcall D3DXCreateSprite(ptr ptr)
@ stdcall -stub D3DXCreateTeapot(ptr ptr ptr)
@ stdcall -stub D3DXCreateTextA(ptr long ptr long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextW(ptr long ptr long long ptr ptr ptr)
@ stub D3DXCreateTeapot
@ stub D3DXCreateTextA
@ stub D3DXCreateTextW
@ stdcall D3DXCreateTexture(ptr long long long long long long ptr)
@ stdcall -stub D3DXCreateTextureFromFileA(ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromFileExA(ptr ptr long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromFileExW(ptr ptr long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromFileInMemory(ptr ptr long ptr)
@ stdcall -stub D3DXCreateTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromFileW(ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromResourceA(ptr long ptr ptr)
@ stdcall -stub D3DXCreateTextureFromResourceExA(ptr long ptr long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromResourceExW(ptr long ptr long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateTextureFromResourceW(ptr long ptr ptr)
@ stdcall -stub D3DXCreateTextureGutterHelper(long long ptr long ptr)
@ stdcall -stub D3DXCreateTextureShader(ptr ptr)
@ stdcall -stub D3DXCreateTorus(ptr long long long long ptr ptr)
@ stdcall -stub D3DXCreateVolumeTexture(ptr long long long long long long long ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileA(ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileExA(ptr ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileExW(ptr ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileInMemory(ptr ptr long ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileInMemoryEx(ptr ptr long long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromFileW(ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromResourceA(ptr long ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromResourceExA(ptr long ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromResourceExW(ptr long ptr long long long long long long long long long long ptr ptr ptr)
@ stdcall -stub D3DXCreateVolumeTextureFromResourceW(ptr long ptr ptr)
@ stub D3DXCreateTextureFromFileA
@ stub D3DXCreateTextureFromFileExA
@ stub D3DXCreateTextureFromFileExW
@ stub D3DXCreateTextureFromFileInMemory
@ stub D3DXCreateTextureFromFileInMemoryEx
@ stub D3DXCreateTextureFromFileW
@ stub D3DXCreateTextureFromResourceA
@ stub D3DXCreateTextureFromResourceExA
@ stub D3DXCreateTextureFromResourceExW
@ stub D3DXCreateTextureFromResourceW
@ stub D3DXCreateTextureGutterHelper
@ stub D3DXCreateTextureShader
@ stub D3DXCreateTorus
@ stub D3DXCreateVolumeTexture
@ stub D3DXCreateVolumeTextureFromFileA
@ stub D3DXCreateVolumeTextureFromFileExA
@ stub D3DXCreateVolumeTextureFromFileExW
@ stub D3DXCreateVolumeTextureFromFileInMemory
@ stub D3DXCreateVolumeTextureFromFileInMemoryEx
@ stub D3DXCreateVolumeTextureFromFileW
@ stub D3DXCreateVolumeTextureFromResourceA
@ stub D3DXCreateVolumeTextureFromResourceExA
@ stub D3DXCreateVolumeTextureFromResourceExW
@ stub D3DXCreateVolumeTextureFromResourceW
@ stdcall D3DXDebugMute(long)
@ stdcall -stub D3DXDeclaratorFromFVF(long ptr)
@ stdcall -stub D3DXDisassembleEffect(ptr long ptr)
@ stdcall -stub D3DXDisassembleShader(ptr long ptr ptr)
@ stdcall -stub D3DXFileCreate(ptr)
@ stdcall -stub D3DXFillCubeTexture(ptr ptr ptr)
@ stdcall -stub D3DXFillCubeTextureTX(ptr ptr)TX
@ stdcall -stub D3DXFillTexture(ptr ptr ptr)
@ stdcall -stub D3DXFillTextureTX(ptr ptr)
@ stdcall -stub D3DXFillVolumeTexture(ptr ptr ptr)
@ stdcall -stub D3DXFillVolumeTextureTX(ptr ptr)
@ stdcall -stub D3DXFilterTexture(ptr ptr long long)
@ stub D3DXDeclaratorFromFVF
@ stub D3DXDisassembleEffect
@ stub D3DXDisassembleShader
@ stub D3DXFileCreate
@ stub D3DXFillCubeTexture
@ stub D3DXFillCubeTextureTX
@ stub D3DXFillTexture
@ stub D3DXFillTextureTX
@ stub D3DXFillVolumeTexture
@ stub D3DXFillVolumeTextureTX
@ stub D3DXFilterTexture
@ stdcall D3DXFindShaderComment(ptr long ptr ptr)
@ stdcall -stub D3DXFloat16To32Array(ptr ptr long)
@ stdcall -stub D3DXFloat32To16Array(ptr ptr long)
@ stdcall -stub D3DXFrameAppendChild(ptr ptr)
@ stdcall -stub D3DXFrameCalculateBoundingSphere(ptr ptr ptr)
@ stdcall -stub D3DXFrameDestroy(ptr ptr)
@ stdcall -stub D3DXFrameFind(ptr ptr)
@ stdcall -stub D3DXFrameNumNamedMatrices(ptr)
@ stdcall -stub D3DXFrameRegisterNamedMatrices(ptr ptr)
@ stub D3DXFloat16To32Array
@ stub D3DXFloat32To16Array
@ stub D3DXFrameAppendChild
@ stub D3DXFrameCalculateBoundingSphere
@ stub D3DXFrameDestroy
@ stub D3DXFrameFind
@ stub D3DXFrameNumNamedMatrices
@ stub D3DXFrameRegisterNamedMatrices
@ stdcall D3DXFresnelTerm(long long)
@ stdcall -stub D3DXFVFFromDeclarator(ptr ptr)
@ stdcall -stub D3DXGatherFragments(ptr long ptr ptr long ptr ptr)
@ stdcall -stub D3DXGatherFragmentsFromFileA(ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXGatherFragmentsFromFileW(ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXGatherFragmentsFromResourceA(long ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXGatherFragmentsFromResourceW(long ptr ptr ptr long ptr ptr)
@ stdcall -stub D3DXGenerateOutputDecl(ptr ptr)
@ stdcall -stub D3DXGeneratePMesh(ptr ptr ptr ptr long long ptr)
@ stdcall -stub D3DXGetDeclLength(ptr)
@ stub D3DXFVFFromDeclarator
@ stub D3DXGatherFragments
@ stub D3DXGatherFragmentsFromFileA
@ stub D3DXGatherFragmentsFromFileW
@ stub D3DXGatherFragmentsFromResourceA
@ stub D3DXGatherFragmentsFromResourceW
@ stub D3DXGenerateOutputDecl
@ stub D3DXGeneratePMesh
@ stub D3DXGetDeclLength
@ stdcall D3DXGetDeclVertexSize(ptr long)
@ stdcall D3DXGetDriverLevel(ptr)
@ stdcall D3DXGetFVFVertexSize(long)
@@ -159,29 +159,29 @@
@ stdcall D3DXGetPixelShaderProfile(ptr)
@ stdcall D3DXGetShaderConstantTable(ptr ptr)
@ stdcall D3DXGetShaderConstantTableEx(ptr long ptr)
@ stdcall -stub D3DXGetShaderInputSemantics(ptr ptr ptr)
@ stdcall -stub D3DXGetShaderOutputSemantics(ptr ptr ptr)
@ stdcall -stub D3DXGetShaderSamplers(ptr ptr ptr)
@ stub D3DXGetShaderInputSemantics
@ stub D3DXGetShaderOutputSemantics
@ stub D3DXGetShaderSamplers
@ stdcall D3DXGetShaderSize(ptr)
@ stdcall D3DXGetShaderVersion(ptr)
@ stdcall D3DXGetVertexShaderProfile(ptr)
@ stdcall -stub D3DXIntersect(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXIntersectSubset(ptr long ptr ptr ptr ptr ptr ptr ptr ptr ptr)
@ stub D3DXIntersect
@ stub D3DXIntersectSubset
@ stdcall D3DXIntersectTri(ptr ptr ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshFromXA(ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshFromXInMemory(ptr long long ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshFromXResource(long ptr ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshFromXW(ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshHierarchyFromXA(ptr long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshHierarchyFromXInMemory(ptr long long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadMeshHierarchyFromXW(ptr long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXLoadPatchMeshFromXof(ptr long ptr ptr ptr long ptr)
@ stdcall -stub D3DXLoadPRTBufferFromFileA(ptr ptr)
@ stdcall -stub D3DXLoadPRTBufferFromFileW(ptr ptr)
@ stdcall -stub D3DXLoadPRTCompBufferFromFileA(ptr ptr)
@ stdcall -stub D3DXLoadPRTCompBufferFromFileW(ptr ptr)
@ stdcall -stub D3DXLoadSkinMeshFromXof(ptr long ptr ptr ptr ptr ptr ptr ptr)
@ stub D3DXLoadMeshFromXA
@ stub D3DXLoadMeshFromXInMemory
@ stub D3DXLoadMeshFromXResource
@ stub D3DXLoadMeshFromXW
@ stub D3DXLoadMeshFromXof
@ stub D3DXLoadMeshHierarchyFromXA
@ stub D3DXLoadMeshHierarchyFromXInMemory
@ stub D3DXLoadMeshHierarchyFromXW
@ stub D3DXLoadPatchMeshFromXof
@ stub D3DXLoadPRTBufferFromFileA
@ stub D3DXLoadPRTBufferFromFileW
@ stub D3DXLoadPRTCompBufferFromFileA
@ stub D3DXLoadPRTCompBufferFromFileW
@ stub D3DXLoadSkinMeshFromXof
@ stdcall D3DXLoadSurfaceFromFileA(ptr ptr ptr str ptr long long ptr)
@ stdcall D3DXLoadSurfaceFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
@ stdcall D3DXLoadSurfaceFromFileW(ptr ptr ptr wstr ptr long long ptr)
@@ -189,13 +189,13 @@
@ stdcall D3DXLoadSurfaceFromResourceA(ptr ptr ptr ptr str ptr long long ptr)
@ stdcall D3DXLoadSurfaceFromResourceW(ptr ptr ptr ptr wstr ptr long long ptr)
@ stdcall D3DXLoadSurfaceFromSurface(ptr ptr ptr ptr ptr ptr long long)
@ stdcall -stub D3DXLoadVolumeFromFileA(ptr ptr ptr ptr ptr long long ptr)
@ stdcall -stub D3DXLoadVolumeFromFileInMemory(ptr ptr ptr ptr long ptr long long ptr)
@ stdcall -stub D3DXLoadVolumeFromFileW(ptr ptr ptr ptr ptr long long ptr)
@ stdcall -stub D3DXLoadVolumeFromMemory(ptr ptr ptr ptr long long long ptr ptr long long)
@ stdcall -stub D3DXLoadVolumeFromResourceA(ptr ptr ptr long ptr ptr long long ptr)
@ stdcall -stub D3DXLoadVolumeFromResourceW(ptr ptr ptr long ptr ptr long long ptr)
@ stdcall -stub D3DXLoadVolumeFromVolume(ptr ptr ptr ptr ptr ptr long long)
@ stub D3DXLoadVolumeFromFileA
@ stub D3DXLoadVolumeFromFileInMemory
@ stub D3DXLoadVolumeFromFileW
@ stub D3DXLoadVolumeFromMemory
@ stub D3DXLoadVolumeFromResourceA
@ stub D3DXLoadVolumeFromResourceW
@ stub D3DXLoadVolumeFromVolume
@ stdcall D3DXMatrixAffineTransformation(ptr long ptr ptr ptr)
@ stdcall D3DXMatrixAffineTransformation2D(ptr long ptr long ptr)
@ stdcall D3DXMatrixDecompose(ptr ptr ptr ptr)
@@ -228,8 +228,8 @@
@ stdcall D3DXMatrixTransformation2D(ptr ptr long ptr ptr long ptr)
@ stdcall D3DXMatrixTranslation(ptr long long long)
@ stdcall D3DXMatrixTranspose(ptr ptr)
@ stdcall -stub D3DXOptimizeFaces(ptr long long long ptr)
@ stdcall -stub D3DXOptimizeVertices(ptr long long long ptr)
@ stub D3DXOptimizeFaces
@ stub D3DXOptimizeVertices
@ stdcall D3DXPlaneFromPointNormal(ptr ptr ptr)
@ stdcall D3DXPlaneFromPoints(ptr ptr ptr ptr)
@ stdcall D3DXPlaneIntersectLine(ptr ptr ptr ptr)
@@ -252,56 +252,56 @@
@ stdcall D3DXQuaternionRotationYawPitchRoll(ptr long long long)
@ stdcall D3DXQuaternionSlerp(ptr ptr ptr long)
@ stdcall D3DXQuaternionSquad(ptr ptr ptr ptr ptr long)
@ stdcall -stub D3DXQuaternionSquadSetup(ptr ptr ptr ptr ptr ptr ptr)
@ stub D3DXQuaternionSquadSetup
@ stdcall D3DXQuaternionToAxisAngle(ptr ptr ptr)
@ stdcall -stub D3DXRectPatchSize(ptr ptr ptr)
@ stdcall -stub D3DXSaveMeshHierarchyToFileA(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveMeshHierarchyToFileW(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveMeshToXA(ptr ptr ptr ptr ptr long long)
@ stdcall -stub D3DXSaveMeshToXW(ptr ptr ptr ptr ptr long long)
@ stdcall -stub D3DXSavePRTBufferToFileA(ptr ptr)
@ stdcall -stub D3DXSavePRTBufferToFileW(ptr ptr)
@ stdcall -stub D3DXSavePRTCompBufferToFileA(ptr ptr)
@ stdcall -stub D3DXSavePRTCompBufferToFileW(ptr ptr)
@ stdcall -stub D3DXSaveSurfaceToFileA(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveSurfaceToFileInMemory(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveSurfaceToFileW(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveTextureToFileA(ptr long ptr ptr)
@ stdcall -stub D3DXSaveTextureToFileInMemory(ptr long ptr ptr)
@ stdcall -stub D3DXSaveTextureToFileW(ptr long ptr ptr)
@ stdcall -stub D3DXSaveVolumeToFileA(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveVolumeToFileInMemory(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSaveVolumeToFileW(ptr long ptr ptr ptr)
@ stdcall -stub D3DXSHAdd(ptr long ptr ptr)
@ stdcall -stub D3DXSHDot(long ptr ptr)
@ stdcall -stub D3DXSHEvalConeLight(long ptr long long long long ptr ptr ptr)
@ stdcall -stub D3DXSHEvalDirection(ptr long ptr)
@ stdcall -stub D3DXSHEvalDirectionalLight(long ptr long long long long ptr ptr ptr)
@ stdcall -stub D3DXSHEvalHemisphereLight(long ptr long long ptr ptr ptr)
@ stdcall -stub D3DXSHEvalSphericalLight(long ptr long long long long ptr ptr ptr)
@ stub D3DXRectPatchSize
@ stub D3DXSaveMeshHierarchyToFileA
@ stub D3DXSaveMeshHierarchyToFileW
@ stub D3DXSaveMeshToXA
@ stub D3DXSaveMeshToXW
@ stub D3DXSavePRTBufferToFileA
@ stub D3DXSavePRTBufferToFileW
@ stub D3DXSavePRTCompBufferToFileA
@ stub D3DXSavePRTCompBufferToFileW
@ stub D3DXSaveSurfaceToFileA
@ stub D3DXSaveSurfaceToFileInMemory
@ stub D3DXSaveSurfaceToFileW
@ stub D3DXSaveTextureToFileA
@ stub D3DXSaveTextureToFileInMemory
@ stub D3DXSaveTextureToFileW
@ stub D3DXSaveVolumeToFileA
@ stub D3DXSaveVolumeToFileInMemory
@ stub D3DXSaveVolumeToFileW
@ stub D3DXSHAdd
@ stub D3DXSHDot
@ stub D3DXSHEvalConeLight
@ stub D3DXSHEvalDirection
@ stub D3DXSHEvalDirectionalLight
@ stub D3DXSHEvalHemisphereLight
@ stub D3DXSHEvalSphericalLight
@ stub D3DXSHMultiply2
@ stub D3DXSHMultiply3
@ stub D3DXSHMultiply4
@ stub D3DXSHMultiply5
@ stub D3DXSHMultiply6
@ stdcall -stub D3DXSHProjectCubeMap(long ptr ptr ptr ptr)
@ stdcall -stub D3DXSHPRTCompSplitMeshSC(ptr long long ptr long ptr long long ptr ptr long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXSHPRTCompSuperCluster(ptr ptr long long ptr ptr)
@ stdcall -stub D3DXSHRotate(ptr long ptr ptr)
@ stdcall -stub D3DXSHRotateZ(ptr long long ptr)
@ stdcall -stub D3DXSHScale(ptr long ptr ptr)
@ stdcall -stub D3DXSimplifyMesh(ptr ptr ptr ptr long long ptr)
@ stub D3DXSHProjectCubeMap
@ stub D3DXSHPRTCompSplitMeshSC
@ stub D3DXSHPRTCompSuperCluster
@ stub D3DXSHRotate
@ stub D3DXSHRotateZ
@ stub D3DXSHScale
@ stub D3DXSimplifyMesh
@ stdcall D3DXSphereBoundProbe(ptr long ptr ptr)
@ stdcall -stub D3DXSplitMesh(ptr ptr long long ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXTessellateNPatches(ptr ptr long long ptr ptr)
@ stdcall -stub D3DXTessellateRectPatch(ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXTessellateTriPatch(ptr ptr ptr ptr ptr)
@ stdcall -stub D3DXTriPatchSize(ptr ptr ptr)
@ stub D3DXSplitMesh
@ stub D3DXTessellateNPatches
@ stub D3DXTessellateRectPatch
@ stub D3DXTessellateTriPatch
@ stub D3DXTriPatchSize
@ stub D3DXUVAtlasCreate
@ stub D3DXUVAtlasPack
@ stub D3DXUVAtlasPartition
@ stdcall -stub D3DXValidMesh(ptr ptr ptr)
@ stdcall -stub D3DXValidPatchMesh(ptr ptr ptr ptr)
@ stub D3DXValidMesh
@ stub D3DXValidPatchMesh
@ stdcall D3DXVec2BaryCentric(ptr ptr ptr ptr long long)
@ stdcall D3DXVec2CatmullRom(ptr ptr ptr ptr ptr long)
@ stdcall D3DXVec2Hermite(ptr ptr ptr ptr ptr long)
@@ -333,4 +333,4 @@
@ stdcall D3DXVec4Normalize(ptr ptr)
@ stdcall D3DXVec4Transform(ptr ptr ptr)
@ stdcall D3DXVec4TransformArray(ptr long ptr long ptr long)
@ stdcall -stub D3DXWeldVertices(ptr long ptr ptr ptr ptr ptr)
@ stub D3DXWeldVertices
@@ -33,10 +33,6 @@
#include "d3dx9.h"
#ifdef _MSC_VER
DEFINE_GUID(IID_IUnknown, 0x00000000, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
#endif
/***********************************************************************
* DllMain.
*/
+1 -1
View File
@@ -1,4 +1,4 @@
/*
/*
* Direct3D state management
*
* Copyright 2002 Lionel Ulmer
+3 -1
View File
@@ -1996,9 +1996,11 @@ NTAPI
LdrpInitFailure(NTSTATUS Status)
{
ULONG Response;
PPEB Peb = NtCurrentPeb();
/* Print a debug message */
DPRINT1("LDR: Process initialization failure; NTSTATUS = %08lx\n", Status);
DPRINT1("LDR: Process initialization failure for %wZ; NTSTATUS = %08lx\n",
&Peb->ProcessParameters->ImagePathName, Status);
/* Raise a hard error */
if (!LdrpFatalHardErrorCount)
+1 -13
View File
@@ -29,7 +29,6 @@ BOOLEAN BaseRunningInServerProcess;
WCHAR BaseDefaultPathBuffer[6140];
HANDLE BaseNamedObjectDirectory;
HANDLE hProcessHeap = NULL;
HMODULE hCurrentModule = NULL;
HMODULE kernel32_handle = NULL;
HANDLE hBaseDir = NULL;
@@ -58,13 +57,6 @@ extern BOOL FASTCALL NlsInit(VOID);
extern VOID FASTCALL NlsUninit(VOID);
BOOLEAN InWindows = FALSE;
HANDLE
WINAPI
DuplicateConsoleHandle(HANDLE hConsole,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions);
#define WIN_OBJ_DIR L"\\Windows"
#define SESSION_DIR L"\\Sessions"
@@ -323,11 +315,7 @@ DllMain(HANDLE hDll,
}
/* Initialize heap handle table */
hProcessHeap = RtlGetProcessHeap();
RtlInitializeHandleTable(0xFFFF,
sizeof(BASE_HEAP_HANDLE_ENTRY),
&BaseHeapHandleTable);
DPRINT("Heap: %p\n", hProcessHeap);
BaseDllInitializeMemoryManager();
/* Set HMODULE for our DLL */
kernel32_handle = hCurrentModule = hDll;
+12 -12
View File
@@ -364,7 +364,7 @@ InternalFindFirstFile (
if (!NT_SUCCESS(Status))
{
RtlFreeHeap (hProcessHeap,
RtlFreeHeap (RtlGetProcessHeap(),
0,
NtPathBuffer);
@@ -387,20 +387,20 @@ InternalFindFirstFile (
{
/* No file part?! */
NtClose(hDirectory);
RtlFreeHeap (hProcessHeap,
RtlFreeHeap (RtlGetProcessHeap(),
0,
NtPathBuffer);
SetLastError(ERROR_FILE_NOT_FOUND);
return INVALID_HANDLE_VALUE;
}
IHeader = RtlAllocateHeap (hProcessHeap,
IHeader = RtlAllocateHeap (RtlGetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(KERNEL32_FIND_DATA_HEADER) +
sizeof(KERNEL32_FIND_FILE_DATA) + FIND_DATA_SIZE);
if (NULL == IHeader)
{
RtlFreeHeap (hProcessHeap,
RtlFreeHeap (RtlGetProcessHeap(),
0,
NtPathBuffer);
NtClose(hDirectory);
@@ -431,7 +431,7 @@ InternalFindFirstFile (
&PathFileName,
lpFindFileData);
RtlFreeHeap (hProcessHeap,
RtlFreeHeap (RtlGetProcessHeap(),
0,
NtPathBuffer);
@@ -596,7 +596,7 @@ FindClose (
PKERNEL32_FIND_STREAM_DATA IData = (PKERNEL32_FIND_STREAM_DATA)(IHeader + 1);
if (IData->pFileStreamInfo != NULL)
{
RtlFreeHeap (hProcessHeap, 0, IData->pFileStreamInfo);
RtlFreeHeap (RtlGetProcessHeap(), 0, IData->pFileStreamInfo);
}
break;
}
@@ -606,7 +606,7 @@ FindClose (
return FALSE;
}
RtlFreeHeap (hProcessHeap, 0, IHeader);
RtlFreeHeap (RtlGetProcessHeap(), 0, IHeader);
return TRUE;
}
@@ -835,7 +835,7 @@ FindFirstStreamW(IN LPCWSTR lpFileName,
}
/* create the search context */
IHeader = RtlAllocateHeap(hProcessHeap,
IHeader = RtlAllocateHeap(RtlGetProcessHeap(),
0,
sizeof(KERNEL32_FIND_DATA_HEADER) +
sizeof(KERNEL32_FIND_STREAM_DATA));
@@ -859,7 +859,7 @@ FindFirstStreamW(IN LPCWSTR lpFileName,
if (IData->pFileStreamInfo == NULL)
{
IData->pFileStreamInfo = RtlAllocateHeap(hProcessHeap,
IData->pFileStreamInfo = RtlAllocateHeap(RtlGetProcessHeap(),
0,
BufferSize);
if (IData->pFileStreamInfo == NULL)
@@ -872,7 +872,7 @@ FindFirstStreamW(IN LPCWSTR lpFileName,
{
PFILE_STREAM_INFORMATION pfsi;
pfsi = RtlReAllocateHeap(hProcessHeap,
pfsi = RtlReAllocateHeap(RtlGetProcessHeap(),
0,
IData->pFileStreamInfo,
BufferSize);
@@ -923,12 +923,12 @@ Cleanup:
{
if (IData->pFileStreamInfo != NULL)
{
RtlFreeHeap(hProcessHeap,
RtlFreeHeap(RtlGetProcessHeap(),
0,
IData->pFileStreamInfo);
}
RtlFreeHeap(hProcessHeap,
RtlFreeHeap(RtlGetProcessHeap(),
0,
IHeader);
}
+178 -182
View File
@@ -1,209 +1,206 @@
/* $Id$
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/kernel32/misc/handle.c
* PURPOSE: Object functions
* PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
* UPDATE HISTORY:
* Created 01/11/98
/*
* PROJECT: ReactOS Win32 Base API
* LICENSE: See COPYING in the top level directory
* FILE: dll/win32/kernel32/client/handle.c
* PURPOSE: Object Handle Functions
* PROGRAMMERS: Ariadne ( ariadne@xs4all.nl)
*/
/* INCLUDES ******************************************************************/
/* INCLUDES *******************************************************************/
#include <k32.h>
#define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
/* PRIVATE FUNCTIONS **********************************************************/
HANDLE WINAPI
DuplicateConsoleHandle (HANDLE hConsole,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions);
/* FUNCTIONS *****************************************************************/
HANDLE FASTCALL
TranslateStdHandle(HANDLE hHandle)
HANDLE
FASTCALL
TranslateStdHandle(IN HANDLE hHandle)
{
PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
PRTL_USER_PROCESS_PARAMETERS Ppb = NtCurrentPeb()->ProcessParameters;
switch ((ULONG)hHandle)
switch ((ULONG)hHandle)
{
case STD_INPUT_HANDLE: return Ppb->StandardInput;
case STD_OUTPUT_HANDLE: return Ppb->StandardOutput;
case STD_ERROR_HANDLE: return Ppb->StandardError;
case STD_INPUT_HANDLE: return Ppb->StandardInput;
case STD_OUTPUT_HANDLE: return Ppb->StandardOutput;
case STD_ERROR_HANDLE: return Ppb->StandardError;
}
return hHandle;
return hHandle;
}
/* PUBLIC FUNCTIONS ***********************************************************/
/*
* @implemented
*/
BOOL WINAPI
GetHandleInformation (HANDLE hObject,
LPDWORD lpdwFlags)
BOOL
WINAPI
GetHandleInformation(IN HANDLE hObject,
OUT LPDWORD lpdwFlags)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
NTSTATUS Status;
DWORD Flags;
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
NTSTATUS Status;
DWORD Flags;
hObject = TranslateStdHandle(hObject);
hObject = TranslateStdHandle(hObject);
Status = NtQueryObject (hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (NT_SUCCESS(Status))
{
Flags = 0;
if (HandleInfo.Inherit)
Flags |= HANDLE_FLAG_INHERIT;
if (HandleInfo.ProtectFromClose)
Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
*lpdwFlags = Flags;
return TRUE;
}
else
{
BaseSetLastNTError (Status);
return FALSE;
}
}
/*
* @implemented
*/
BOOL WINAPI
SetHandleInformation (HANDLE hObject,
DWORD dwMask,
DWORD dwFlags)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
NTSTATUS Status;
hObject = TranslateStdHandle(hObject);
Status = NtQueryObject (hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (NT_SUCCESS(Status))
{
if (dwMask & HANDLE_FLAG_INHERIT)
HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0;
if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
Status = NtSetInformationObject (hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION));
if(!NT_SUCCESS(Status))
if (IsConsoleHandle(hObject))
{
BaseSetLastNTError (Status);
return FALSE;
}
return TRUE;
}
else
{
BaseSetLastNTError (Status);
return FALSE;
}
}
/*
* @implemented
*/
BOOL WINAPI CloseHandle(HANDLE hObject)
/*
* FUNCTION: Closes an open object handle
* PARAMETERS:
* hObject = Identifies an open object handle
* RETURNS: If the function succeeds, the return value is nonzero
* If the function fails, the return value is zero
*/
{
NTSTATUS Status;
hObject = TranslateStdHandle(hObject);
if (IsConsoleHandle(hObject))
{
return(CloseConsoleHandle(hObject));
}
Status = NtClose(hObject);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError (Status);
return FALSE;
}
return TRUE;
}
/*
* @implemented
*/
BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions)
{
DWORD SourceProcessId, TargetProcessId;
NTSTATUS Status;
hSourceHandle = TranslateStdHandle(hSourceHandle);
if (IsConsoleHandle(hSourceHandle))
{
SourceProcessId = GetProcessId(hSourceProcessHandle);
TargetProcessId = GetProcessId(hTargetProcessHandle);
if (!SourceProcessId || !TargetProcessId ||
SourceProcessId != TargetProcessId ||
SourceProcessId != GetCurrentProcessId())
{
SetLastError(ERROR_INVALID_PARAMETER);
/* FIXME: GetConsoleHandleInformation required */
UNIMPLEMENTED;
BaseSetLastNTError(STATUS_NOT_IMPLEMENTED);
return FALSE;
}
}
*lpTargetHandle = DuplicateConsoleHandle(hSourceHandle, dwDesiredAccess, bInheritHandle, dwOptions);
return *lpTargetHandle != INVALID_HANDLE_VALUE;
}
Status = NtQueryObject(hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
Status = NtDuplicateObject(hSourceProcessHandle,
hSourceHandle,
hTargetProcessHandle,
lpTargetHandle,
dwDesiredAccess,
bInheritHandle ? OBJ_INHERIT : 0,
dwOptions);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError (Status);
return FALSE;
}
Flags = 0;
if (HandleInfo.Inherit) Flags |= HANDLE_FLAG_INHERIT;
if (HandleInfo.ProtectFromClose) Flags |= HANDLE_FLAG_PROTECT_FROM_CLOSE;
*lpdwFlags = Flags;
return TRUE;
}
return TRUE;
/*
* @implemented
*/
BOOL
WINAPI
SetHandleInformation(IN HANDLE hObject,
IN DWORD dwMask,
IN DWORD dwFlags)
{
OBJECT_HANDLE_ATTRIBUTE_INFORMATION HandleInfo;
ULONG BytesWritten;
NTSTATUS Status;
hObject = TranslateStdHandle(hObject);
if (IsConsoleHandle(hObject))
{
/* FIXME: SetConsoleHandleInformation required */
UNIMPLEMENTED;
BaseSetLastNTError(STATUS_NOT_IMPLEMENTED);
return FALSE;
}
Status = NtQueryObject(hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(OBJECT_HANDLE_ATTRIBUTE_INFORMATION),
&BytesWritten);
if (!NT_SUCCESS(Status))
{
BaseSetLastNTError(Status);
return FALSE;
}
if (dwMask & HANDLE_FLAG_INHERIT)
{
HandleInfo.Inherit = (dwFlags & HANDLE_FLAG_INHERIT) != 0;
}
if (dwMask & HANDLE_FLAG_PROTECT_FROM_CLOSE)
{
HandleInfo.ProtectFromClose = (dwFlags & HANDLE_FLAG_PROTECT_FROM_CLOSE) != 0;
}
Status = NtSetInformationObject(hObject,
ObjectHandleFlagInformation,
&HandleInfo,
sizeof(HandleInfo));
if (NT_SUCCESS(Status)) return TRUE;
BaseSetLastNTError(Status);
return FALSE;
}
/*
* @implemented
*/
BOOL
WINAPI
CloseHandle(IN HANDLE hObject)
{
NTSTATUS Status;
hObject = TranslateStdHandle(hObject);
if (IsConsoleHandle(hObject)) return CloseConsoleHandle(hObject);
Status = NtClose(hObject);
if (NT_SUCCESS(Status)) return TRUE;
BaseSetLastNTError(Status);
return FALSE;
}
/*
* @implemented
*/
BOOL
WINAPI
DuplicateHandle(IN HANDLE hSourceProcessHandle,
IN HANDLE hSourceHandle,
IN HANDLE hTargetProcessHandle,
OUT LPHANDLE lpTargetHandle,
IN DWORD dwDesiredAccess,
IN BOOL bInheritHandle,
IN DWORD dwOptions)
{
NTSTATUS Status;
HANDLE hTargetHandle;
hSourceHandle = TranslateStdHandle(hSourceHandle);
if ((IsConsoleHandle(hSourceHandle)) &&
((hSourceHandle != NtCurrentProcess()) &&
(hSourceHandle != NtCurrentThread())))
{
if ((hSourceProcessHandle != NtCurrentProcess()) &&
(hTargetProcessHandle != NtCurrentProcess()))
{
BaseSetLastNTError(STATUS_INVALID_PARAMETER);
return FALSE;
}
hTargetHandle = DuplicateConsoleHandle(hSourceHandle,
dwDesiredAccess,
bInheritHandle,
dwOptions);
if (hTargetHandle != INVALID_HANDLE_VALUE)
{
if (lpTargetHandle) *lpTargetHandle = hTargetHandle;
return TRUE;
}
return FALSE;
}
Status = NtDuplicateObject(hSourceProcessHandle,
hSourceHandle,
hTargetProcessHandle,
lpTargetHandle,
dwDesiredAccess,
bInheritHandle ? OBJ_INHERIT : 0,
dwOptions);
if (NT_SUCCESS(Status)) return TRUE;
BaseSetLastNTError(Status);
return FALSE;
}
/*
@@ -211,9 +208,9 @@ BOOL WINAPI DuplicateHandle(HANDLE hSourceProcessHandle,
*/
UINT
WINAPI
SetHandleCount(UINT nCount)
SetHandleCount(IN UINT nCount)
{
return nCount;
return nCount;
}
/*
@@ -240,7 +237,6 @@ CreateSocketHandle(VOID)
DbgPrintEx(0, 0, "Unsupported API - kernel32!CreateSocketHandle() called\n");
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
}
/*
File diff suppressed because it is too large Load Diff
-6
View File
@@ -33,12 +33,6 @@
// API for it (such as GlobalLock).
//
//
// The Handle Table
//
extern RTL_HANDLE_TABLE BaseHeapHandleTable;
//
// Tracing Support
// Define _BASE_HANDLE_TRACE for Traces
//
+12 -1
View File
@@ -91,7 +91,6 @@ DWORD
/* GLOBAL VARIABLES **********************************************************/
extern BOOL bIsFileApiAnsi;
extern HANDLE hProcessHeap;
extern HANDLE hBaseDir;
extern HMODULE hCurrentModule;
@@ -110,6 +109,10 @@ extern BOOLEAN BaseRunningInServerProcess;
/* FUNCTION PROTOTYPES *******************************************************/
VOID
NTAPI
BaseDllInitializeMemoryManager(VOID);
BOOL WINAPI VerifyConsoleIoHandle(HANDLE Handle);
BOOL WINAPI CloseConsoleHandle(HANDLE Handle);
@@ -249,3 +252,11 @@ BaseSetLastNTError(IN NTSTATUS Status);
/* FIXME */
WCHAR WINAPI RtlAnsiCharToUnicodeChar(LPSTR *);
HANDLE
WINAPI
DuplicateConsoleHandle(HANDLE hConsole,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions);
+4 -4
View File
@@ -33,10 +33,10 @@ FONT 8, "MS Shell Dlg"
LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8
CHECKBOX "Ne jelení&tse meg ezt az üzenetet mégegyszer", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK", IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Mégse", IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Igen", IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Nem", IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Mégse" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Igen" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Nem" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
}
STRINGTABLE
+4 -4
View File
@@ -34,10 +34,10 @@ FONT 8, "MS Shell Dlg"
LTEXT "", IDS_ERR_USER_MSG2, 15, 5, 28, 20
LTEXT "", IDS_ERR_USER_MSG, 15, 5, 210, 8
CHECKBOX "Não &mostrar esta mensagem novamente", IDC_ERR_DONT_SHOW, 5, 20, 210, 10, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK", IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Cancelar", IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Sim", IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Não", IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&OK" IDOK, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Cancelar" IDCANCEL, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Sim" IDYES, 105, 40, 50, 14, WS_GROUP | WS_TABSTOP
PUSHBUTTON L"&Não" IDNO, 160, 40, 50, 14, WS_GROUP | WS_TABSTOP
}
STRINGTABLE
+3 -3
View File
@@ -7,9 +7,9 @@
7 stdcall getsockopt(long long long ptr ptr) ws2_32.getsockopt
8 stdcall htonl(long) ws2_32.htonl
9 stdcall htons(long) ws2_32.htons
10 stdcall ioctlsocket(long long ptr) ws2_32.ioctlsocket
11 stdcall inet_addr(str) ws2_32.inet_addr
12 stdcall inet_ntoa(ptr) ws2_32.inet_ntoa
10 stdcall inet_addr(str) ws2_32.inet_addr
11 stdcall inet_ntoa(ptr) ws2_32.inet_ntoa
12 stdcall ioctlsocket(long long ptr) ws2_32.ioctlsocket
13 stdcall listen(long long) ws2_32.listen
14 stdcall ntohl(long) ws2_32.ntohl
15 stdcall ntohs(long) ws2_32.ntohs
-1
View File
@@ -1877,7 +1877,6 @@ NdisIPnPStartDevice(
{
NDIS_DbgPrint(MIN_TRACE, ("Failed to open configuration key\n"));
ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
NdisCloseConfiguration(ConfigHandle);
return NdisStatus;
}
+1 -3
View File
@@ -33,15 +33,13 @@
#define DEBUG_INFO 0x02000000
#define DEBUG_ULTRA 0x7FFFFFFF
#define DBG 1
#if DBG
#define REMOVE_PARENS(...) __VA_ARGS__
#define TI_DbgPrint(_t_, _x_) \
DbgPrintEx(DPFLTR_TCPIP_ID, (_t_) | DPFLTR_MASK, "(%s:%d) ", __FILE__, __LINE__), \
DbgPrintEx(DPFLTR_TCPIP_ID, (_t_) | DPFLTR_MASK, REMOVE_PARENS _x_)
//DbgPrint(REMOVE_PARENS _x_)
#else /* DBG */
#define TI_DbgPrint(_t_, _x_)
+1 -2
View File
@@ -242,8 +242,7 @@ UniataSataEvent(
return FALSE;
} // end UniataSataEvent()
ULONG
NTAPI
ULONG
NTAPI
UniataSataReadPort4(
IN PHW_CHANNEL chan,
+2 -1
View File
@@ -96,7 +96,8 @@ typedef struct _COMMON_DEVICE_EXTENSION
typedef struct _FDO_DEVICE_EXTENSION
{
COMMON_DEVICE_EXTENSION Common;
PDRIVER_OBJECT DriverObject;
PDEVICE_OBJECT DeviceObject;
PDEVICE_OBJECT LowerDevice;
PDEVICE_OBJECT Pdo;
ULONG DeviceState;
+1 -3
View File
@@ -11,9 +11,7 @@
/* INCLUDES ******************************************************************/
#include <asm.inc>
#include <ks386.inc>
#include <ndk/asm.h>
/* FUNCTIONS *****************************************************************/
+5
View File
@@ -47,6 +47,11 @@ BOOL WINAPI EncryptionDisable (
BOOL
);
BOOL WINAPI FileEncryptionStatus (
LPCTSTR,
LPDWORD
);
DWORD WINAPI QueryUsersOnEncryptedFile (
LPCWSTR,
PENCRYPTION_CERTIFICATE_HASH_LIST*
+18 -18
View File
@@ -1,18 +1,18 @@
/* Do not edit - Machine generated */
#ifndef _INC_REACTOS_BUILDNO
#define _INC_REACTOS_BUILDNO
#define KERNEL_VERSION_BUILD @KERNEL_VERSION_BUILD@
#define KERNEL_VERSION_BUILD_HEX 0x@KERNEL_VERSION_BUILD_HEX@
#define KERNEL_VERSION_BUILD_STR "@KERNEL_VERSION_BUILD@@REVISION@"
#define KERNEL_VERSION_BUILD_RC "@KERNEL_VERSION_BUILD@@REVISION@\0"
#define KERNEL_RELEASE_RC "@KERNEL_VERSION@\0"
#define KERNEL_RELEASE_STR "@KERNEL_VERSION@"
#define KERNEL_VERSION_RC "@KERNEL_VERSION@\0"
#define KERNEL_VERSION_STR "@KERNEL_VERSION@"
#define REACTOS_DLL_VERSION_MAJOR @REACTOS_DLL_VERSION_MAJOR@
#define REACTOS_DLL_RELEASE_RC "@DLL_VERSION_STR@\0"
#define REACTOS_DLL_RELEASE_STR "@DLL_VERSION_STR@"
#define REACTOS_DLL_VERSION_RC "@DLL_VERSION_STR@\0"
#define REACTOS_DLL_VERSION_STR "@DLL_VERSION_STR@"
#endif
/* EOF */
/* Do not edit - Machine generated */
#ifndef _INC_REACTOS_BUILDNO
#define _INC_REACTOS_BUILDNO
#define KERNEL_VERSION_BUILD @KERNEL_VERSION_BUILD@
#define KERNEL_VERSION_BUILD_HEX 0x@KERNEL_VERSION_BUILD_HEX@
#define KERNEL_VERSION_BUILD_STR "@KERNEL_VERSION_BUILD@@REVISION@"
#define KERNEL_VERSION_BUILD_RC "@KERNEL_VERSION_BUILD@@REVISION@\0"
#define KERNEL_RELEASE_RC "@KERNEL_VERSION@\0"
#define KERNEL_RELEASE_STR "@KERNEL_VERSION@"
#define KERNEL_VERSION_RC "@KERNEL_VERSION@\0"
#define KERNEL_VERSION_STR "@KERNEL_VERSION@"
#define REACTOS_DLL_VERSION_MAJOR @REACTOS_DLL_VERSION_MAJOR@
#define REACTOS_DLL_RELEASE_RC "@DLL_VERSION_STR@\0"
#define REACTOS_DLL_RELEASE_STR "@DLL_VERSION_STR@"
#define REACTOS_DLL_VERSION_RC "@DLL_VERSION_STR@\0"
#define REACTOS_DLL_VERSION_STR "@DLL_VERSION_STR@"
#endif
/* EOF */
+418 -2
View File
@@ -22,7 +22,49 @@ LanguageNames=(English=0x409:MSG00409)
; Facility=System
; Eventlog messages 6xxx-
;
; eventlog events 6000-6099
;
MessageId=6000
Severity=Warning
Facility=System
SymbolicName=EVENT_LOG_FULL
Language=English
The %1 log file is full.
.
MessageId=6001
Severity=Warning
Facility=System
SymbolicName=EVENT_LogFileNotOpened
Language=English
The %1 log file cannot be opened.
.
MessageId=6002
Severity=Warning
Facility=System
SymbolicName=EVENT_LogFileCorrupt
Language=English
The %1 log file is corrupted and will be cleared.
.
MessageId=6003
Severity=Warning
Facility=System
SymbolicName=EVENT_DefaultLogCorrupt
Language=English
The Application log file could not be opened. %1 will be used as the default log file.
.
MessageId=6004
Severity=Warning
Facility=System
SymbolicName=EVENT_BadDriverPacket
Language=English
A driver packet received from the I/O subsystem was invalid. The data is the packet.
.
MessageId=6005
Severity=Warning
@@ -40,6 +82,22 @@ Language=English
The Event log service was stopped.
.
MessageId=6007
Severity=Warning
Facility=System
SymbolicName=TITLE_EventlogMessageBox
Language=English
Eventlog Service %0
.
MessageId=6008
Severity=Warning
Facility=System
SymbolicName=EVENT_EventlogAbnormalShutdown
Language=English
The previous system shutdown at %1 on %2 was unexpected.
.
MessageId=6009
Severity=Warning
Facility=System
@@ -48,8 +106,366 @@ Language=English
ReactOS %1 %2 %3 %4.
.
MessageId=6010
Severity=Error
Facility=System
SymbolicName=EVENT_ServiceNoEventLog
Language=English
The %1 service was unable to set up an event source.
.
; transport messages
MessageId=6011
Severity=Error
Facility=System
SymbolicName=EVENT_ComputerNameChange
Language=English
The NetBIOS name and DNS host name of this machine have been changed from %1 to %2.
.
MessageId=6012
Severity=Error
Facility=System
SymbolicName=EVENT_DNSDomainNameChange
Language=English
The DNS domain assigned to this computer has been changed from %1 to %2.
.
;
; system events 6100 - 6199
;
MessageId=6100
Severity=Error
Facility=System
SymbolicName=EVENT_UP_DRIVER_ON_MP
Language=English
A uniprocessor-specific driver was loaded on a multiprocessor system. The driver could not load.
.
;
; service controller events 7000-7899
;
MessageId=7000
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_FAILED
Language=English
The %1 service failed to start due to the following error: %n%2
.
MessageId=7001
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_FAILED_II
Language=English
The %1 service depends on the %2 service which failed to start because of the following error: %n%3
.
MessageId=7002
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_FAILED_GROUP
Language=English
The %1 service depends on the %2 group and no member of this group started.
.
MessageId=7003
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_FAILED_NONE
Language=English
The %1 service depends on the following nonexistent service: %2
.
MessageId=7004
Severity=Error
Facility=System
SymbolicName=EVENT_CALL_TO_FUNCTION_FAILED
Language=English
The %1 call failed with the following error: %n%2
.
MessageId=7005
Severity=Error
Facility=System
SymbolicName=EVENT_CALL_TO_FUNCTION_FAILED_II
Language=English
The %1 call failed for %2 with the following error: %n%3
.
MessageId=7006
Severity=Error
Facility=System
SymbolicName=EVENT_REVERTED_TO_LASTKNOWNGOOD
Language=English
The system reverted to its last known good configuration. The system is restarting....
.
MessageId=7007
Severity=Error
Facility=System
SymbolicName=EVENT_BAD_ACCOUNT_NAME
Language=English
No backslash is in the account name.
.
MessageId=7008
Severity=Error
Facility=System
SymbolicName=EVENT_CONNECTION_TIMEOUT
Language=English
Timeout (%1 milliseconds) waiting for the %2 service to connect.
.
MessageId=7009
Severity=Error
Facility=System
SymbolicName=EVENT_READFILE_TIMEOUT
Language=English
Timeout (%1 milliseconds) waiting for ReadFile.
.
MessageId=7010
Severity=Error
Facility=System
SymbolicName=EVENT_TRANSACT_TIMEOUT
Language=English
Timeout (%1 milliseconds) waiting for a transaction response from the %2 service.
.
MessageId=7011
Severity=Error
Facility=System
SymbolicName=EVENT_TRANSACT_INVALID
Language=English
Message returned in transaction has incorrect size.
.
MessageId=7012
Severity=Error
Facility=System
SymbolicName=EVENT_FIRST_LOGON_FAILED
Language=English
Logon attempt with current password failed with the following error: %n%1
.
MessageId=7013
Severity=Error
Facility=System
SymbolicName=EVENT_SECOND_LOGON_FAILED
Language=English
Second logon attempt with old password also failed with the following error: %n%1
.
MessageId=7014
Severity=Error
Facility=System
SymbolicName=EVENT_INVALID_DRIVER_DEPENDENCY
Language=English
Boot-start or system-start driver (%1) must not depend on a service.
.
MessageId=7015
Severity=Error
Facility=System
SymbolicName=EVENT_BAD_SERVICE_STATE
Language=English
The %1 service has reported an invalid current state %2.
.
MessageId=7016
Severity=Error
Facility=System
SymbolicName=EVENT_CIRCULAR_DEPENDENCY_DEMAND
Language=English
Detected circular dependencies demand starting %1.
.
MessageId=7017
Severity=Error
Facility=System
SymbolicName=EVENT_CIRCULAR_DEPENDENCY_AUTO
Language=English
Detected circular dependencies auto-starting services.
.
MessageId=7018
Severity=Error
Facility=System
SymbolicName=EVENT_DEPEND_ON_LATER_SERVICE
Language=English
Circular dependency: The %1 service depends on a service in a group which starts later.
.
MessageId=7019
Severity=Error
Facility=System
SymbolicName=EVENT_DEPEND_ON_LATER_GROUP
Language=English
Circular dependency: The %1 service depends on a group which starts later.
.
MessageId=7020
Severity=Error
Facility=System
SymbolicName=EVENT_SEVERE_SERVICE_FAILED
Language=English
About to revert to the last known good configuration because the %1 service failed to start.
.
MessageId=7021
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_HUNG
Language=English
The %1 service hung on starting.
.
MessageId=7022
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_EXIT_FAILED
Language=English
The %1 service terminated with the following error: %n%2
.
MessageId=7023
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_EXIT_FAILED_SPECIFIC
Language=English
The %1 service terminated with service-specific error %2.
.
MessageId=7024
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_START_AT_BOOT_FAILED
Language=English
At least one service or driver failed during system startup. Use Event Viewer to examine the event log for details.
.
MessageId=7025
Severity=Error
Facility=System
SymbolicName=EVENT_BOOT_SYSTEM_DRIVERS_FAILED
Language=English
The following boot-start or system-start driver(s) failed to load: %1
.
MessageId=7026
Severity=Error
Facility=System
SymbolicName=EVENT_RUNNING_LASTKNOWNGOOD
Language=English
ReactOS could not be started as configured. A previous working configuration was used instead.
.
MessageId=7027
Severity=Error
Facility=System
SymbolicName=EVENT_TAKE_OWNERSHIP
Language=English
The %1 Registry key denied access to SYSTEM account programs so the Service Control Manager took ownership of the Registry key.
.
MessageId=7028
Severity=Error
Facility=System
SymbolicName=TITLE_SC_MESSAGE_BOX
Language=English
Service Control Manager %0
.
MessageId=7029
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_NOT_INTERACTIVE
Language=English
The %1 service is marked as an interactive service. However, the system is configured to not allow interactive services. This service may not function properly.
.
MessageId=7030
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_CRASH
Language=English
The %1 service terminated unexpectedly. It has done this %2 time(s). The following corrective action will be taken in %3 milliseconds: %5.
.
MessageId=7031
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_RECOVERY_FAILED
Language=English
The Service Control Manager tried to take a corrective action (%2) after the unexpected termination of the %3 service, but this action failed with the following error: %n%4
.
MessageId=7032
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_SCESRV_FAILED
Language=English
The Service Control Manager did not initialize successfully. The security
configuration server (scesrv.dll) failed to initialize with error %1. The
system is restarting...
.
MessageId=7033
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_CRASH_NO_ACTION
Language=English
The %1 service terminated unexpectedly. It has done this %2 time(s).
.
MessageId=7034
Severity=Informational
Facility=System
SymbolicName=EVENT_SERVICE_CONTROL_SUCCESS
Language=English
The %1 service was successfully sent a %2 control.
.
MessageId=7035
Severity=Informational
Facility=System
SymbolicName=EVENT_SERVICE_STATUS_SUCCESS
Language=English
Service Control Manager %0
.
MessageId=7036
Severity=Error
Facility=System
SymbolicName=EVENT_SERVICE_CONFIG_BACKOUT_FAILED
Language=English
The Service Control Manager encountered an error undoing a configuration change
to the %1 service. The service's %2 is currently in an unpredictable state.
If you do not correct this configuration, you may not be able to restart the %1
service or may encounter other errors. To ensure that the service is configured
properly, use the Services snap-in in Microsoft Management Console (MMC).
.
MessageId=7037
Severity=Error
Facility=System
SymbolicName=EVENT_FIRST_LOGON_FAILED_II
Language=English
The %1 service was unable to log on as %2 with the currently configured
password due to the following error: %n%3%n%nTo ensure that the service is
configured properly, use the Services snap-in in Microsoft Management
Console (MMC).
.
;
; transport events 9000-9499
;
MessageId=9004
Severity=Error
+31 -31
View File
@@ -1,31 +1,31 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: include/internal/version.h
* PURPOSE: Defines the current version
* PROGRAMMER: David Welch ([email protected])
* REVISIONS:
* 1999-11-06 (ea)
* Moved from include/internal in include/reactos
* to be used by buildno.
* 2002-01-17 (ea)
* KERNEL_VERSION removed. Use
* reactos/buildno.h:KERNEL_VERSION_STR instead.
*/
#ifndef __VERSION_H
#define __VERSION_H
#define KERNEL_VERSION_MAJOR @KERNEL_VERSION_MAJOR@
#define KERNEL_VERSION_MINOR @KERNEL_VERSION_MINOR@
#define KERNEL_VERSION_PATCH_LEVEL @KERNEL_VERSION_PATCH_LEVEL@
#define COPYRIGHT_YEAR "@COPYRIGHT_YEAR@"
/* KERNEL_VERSION_BUILD_TYPE is L"SVN", L"RC1", L"RC2" or L"" (for the release) */
#define KERNEL_VERSION_BUILD_TYPE "@KERNEL_VERSION_BUILD_TYPE@"
#endif
/* EOF */
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: include/internal/version.h
* PURPOSE: Defines the current version
* PROGRAMMER: David Welch ([email protected])
* REVISIONS:
* 1999-11-06 (ea)
* Moved from include/internal in include/reactos
* to be used by buildno.
* 2002-01-17 (ea)
* KERNEL_VERSION removed. Use
* reactos/buildno.h:KERNEL_VERSION_STR instead.
*/
#ifndef __VERSION_H
#define __VERSION_H
#define KERNEL_VERSION_MAJOR @KERNEL_VERSION_MAJOR@
#define KERNEL_VERSION_MINOR @KERNEL_VERSION_MINOR@
#define KERNEL_VERSION_PATCH_LEVEL @KERNEL_VERSION_PATCH_LEVEL@
#define COPYRIGHT_YEAR "@COPYRIGHT_YEAR@"
/* KERNEL_VERSION_BUILD_TYPE is L"SVN", L"RC1", L"RC2" or L"" (for the release) */
#define KERNEL_VERSION_BUILD_TYPE "@KERNEL_VERSION_BUILD_TYPE@"
#endif
/* EOF */
+6
View File
@@ -1,2 +1,8 @@
#ifdef _MSC_VER
#include <malloc.h>
#define alloca _alloca
#else
#include_next <alloca.h>
#endif
+1 -5
View File
@@ -153,11 +153,7 @@ struct statfs;
/* Constructor functions */
#ifdef _MSC_VER // ReactOS
#pragma message("DECL_GLOBAL_CONSTRUCTOR is not properly defined")
# define DECL_GLOBAL_CONSTRUCTOR(func) \
static void func(void)
#elif defined(__GNUC__)
#ifdef __GNUC__
# define DECL_GLOBAL_CONSTRUCTOR(func) \
static void func(void) __attribute__((constructor)); \
static void func(void)
+6 -6
View File
@@ -96,7 +96,7 @@ extern void winetest_vskip( const char *msg, __winetest_va_list ap );
#ifdef __GNUC__
extern void __winetest_cdecl winetest_ok( int condition, const char *msg, ... );
extern void __winetest_cdecl winetest_ok( int condition, const char *msg, ... ) __attribute__((format (printf,2,3) ));
extern void __winetest_cdecl winetest_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void __winetest_cdecl winetest_win_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void __winetest_cdecl winetest_trace( const char *msg, ... ) __attribute__((format (printf,1,2)));
@@ -440,13 +440,13 @@ void winetest_wait_child_process( HANDLE process )
{
if (exit_code > 255)
{
fprintf( stdout, "%s: exception 0x%08x in child process\n", current_test->name, (unsigned int)exit_code );
fprintf( stdout, "%s: exception 0x%08x in child process\n", current_test->name, exit_code );
InterlockedIncrement( &failures );
}
else
{
fprintf( stdout, "%s: %u failures in child process\n",
current_test->name, (unsigned int)exit_code );
current_test->name, exit_code );
while (exit_code-- > 0)
InterlockedIncrement(&failures);
}
@@ -558,10 +558,10 @@ static int run_test( const char *name )
if (winetest_debug)
{
fprintf( stdout, "%s: %d tests executed (%d marked as todo, %d %s), %d skipped.\n",
test->name, (int)(successes + failures + todo_successes + todo_failures),
(int)todo_successes, (int)(failures + todo_failures),
test->name, successes + failures + todo_successes + todo_failures,
todo_successes, failures + todo_failures,
(failures + todo_failures != 1) ? "failures" : "failure",
(int)skipped );
skipped );
}
status = (failures + todo_failures < 255) ? failures + todo_failures : 255;
return status;
+1 -1
View File
@@ -25,7 +25,7 @@ struct _xsltStylesheet;
struct jpeg_decompress_struct;
typedef struct IWineD3D * (__stdcall typeof(WineDirect3DCreate))(unsigned int, struct IUnknown *);
typedef struct IWineD3DClipper * (__stdcall typeof(WineDirect3DCreateClipper))(void);
typedef struct IWineD3DClipper * (__stdcall typeof(WineDirect3DCreateClipper))(struct IUnknown *);
typedef int (__stdcall typeof(ImeInquire))(struct _tagIMEINFO *, __typeof_wchar *, const __typeof_wchar *);
typedef int (__stdcall typeof(ImeConfigure))(void *, void *, unsigned int, void *);
typedef int (__stdcall typeof(ImeDestroy))(unsigned int);
+51
View File
@@ -54,9 +54,46 @@ static VOID DisplayIPHeader(
((IPHeader->DstAddr >> 16) & 0xFF), ((IPHeader->DstAddr >> 24) & 0xFF));
}
static VOID DisplayTCPHeader(
PCHAR Header,
UINT Length)
{
/* FIXME: IPv4 only */
PIPv4_HEADER IPHeader = (PIPv4_HEADER)Header;
PTCPv4_HEADER TCPHeader;
if (IPHeader->Protocol != IPPROTO_TCP) {
DbgPrint("This is not a TCP datagram. Protocol is %d\n", IPHeader->Protocol);
return;
}
TCPHeader = (PTCPv4_HEADER)((PCHAR)IPHeader + (IPHeader->VerIHL & 0x0F) * 4);
DbgPrint("TCP header:\n");
DbgPrint(" SourcePort: %d\n", WN2H(TCPHeader->SourcePort));
DbgPrint(" DestinationPort: %d\n", WN2H(TCPHeader->DestinationPort));
DbgPrint(" SequenceNumber: 0x%x\n", DN2H(TCPHeader->SequenceNumber));
DbgPrint(" AckNumber: 0x%x\n", DN2H(TCPHeader->AckNumber));
DbgPrint(" DataOffset: 0x%x (0x%x) 32-bit words\n", TCPHeader->DataOffset, TCPHeader->DataOffset >> 4);
DbgPrint(" Flags: 0x%x (0x%x)\n", TCPHeader->Flags, TCPHeader->Flags & 0x3F);
if ((TCPHeader->Flags & TCP_URG) > 0) DbgPrint(" TCP_URG - Urgent Pointer field significant\n");
if ((TCPHeader->Flags & TCP_ACK) > 0) DbgPrint(" TCP_ACK - Acknowledgement field significant\n");
if ((TCPHeader->Flags & TCP_PSH) > 0) DbgPrint(" TCP_PSH - Push Function\n");
if ((TCPHeader->Flags & TCP_RST) > 0) DbgPrint(" TCP_RST - Reset the connection\n");
if ((TCPHeader->Flags & TCP_SYN) > 0) DbgPrint(" TCP_SYN - Synchronize sequence numbers\n");
if ((TCPHeader->Flags & TCP_FIN) > 0) DbgPrint(" TCP_FIN - No more data from sender\n");
DbgPrint(" Window: 0x%x\n", WN2H(TCPHeader->Window));
DbgPrint(" Checksum: 0x%x\n", WN2H(TCPHeader->Checksum));
DbgPrint(" Urgent: 0x%x\n", WN2H(TCPHeader->Urgent));
}
VOID DisplayTCPPacket(
PIP_PACKET IPPacket)
{
UINT Length;
PCHAR Buffer;
if ((DbgQueryDebugFilterState(DPFLTR_TCPIP_ID, DEBUG_PBUFFER | DPFLTR_MASK) != TRUE) ||
(DbgQueryDebugFilterState(DPFLTR_TCPIP_ID, DEBUG_TCP | DPFLTR_MASK) != TRUE)) {
return;
@@ -75,6 +112,20 @@ VOID DisplayTCPPacket(
TI_DbgPrint(MIN_TRACE, ("TotalSize (%d).\n", IPPacket->TotalSize));
TI_DbgPrint(MIN_TRACE, ("ContigSize (%d).\n", IPPacket->ContigSize));
TI_DbgPrint(MIN_TRACE, ("NdisPacket (0x%X).\n", IPPacket->NdisPacket));
if (IPPacket->NdisPacket) {
NdisQueryPacket(IPPacket->NdisPacket, NULL, NULL, NULL, &Length);
Buffer = ExAllocatePool(NonPagedPool, Length);
if (Buffer) {
Length = CopyPacketToBuffer(Buffer, IPPacket->NdisPacket, 0, Length);
DisplayTCPHeader(Buffer, Length);
ExFreePool(Buffer);
}
} else {
Buffer = IPPacket->Header;
Length = IPPacket->ContigSize;
DisplayTCPHeader(Buffer, Length);
}
}
#endif
-2
View File
@@ -32,8 +32,6 @@ void *RosSymRealloc(void *mem, ulong newsize);
void xfree(void *v);
#define werrstr(str, ...) DPRINT(str "\n" ,##__VA_ARGS__)
//#define werrstr(x, ...) printf("(%s:%d) " x "\n",__FILE__,__LINE__,##__VA_ARGS__)
#define malloc(x) RosSymAllocMem(x)
#define mallocz(x,y) RosSymAllocMemZero(x,y)
#define free(x) xfree(x)
+2 -6
View File
@@ -10,19 +10,15 @@
#define NTOSAPI
#include <ntddk.h>
#include <reactos/rossym.h>
#include <ntimage.h>
#include "rossympriv.h"
#define NDEBUG
#include <debug.h>
#include "rossympriv.h"
#include "pe.h"
#include "dwarf.h"
VOID
RosSymDelete(PROSSYM_INFO RosSymInfo)
{
dwarfclose(RosSymInfo);
RosSymFreeMem(RosSymInfo);
}
/* EOF */
+20 -36
View File
@@ -6,8 +6,6 @@ typedef struct DwarfBlock DwarfBlock;
typedef struct DwarfBuf DwarfBuf;
typedef struct DwarfExpr DwarfExpr;
typedef struct DwarfSym DwarfSym;
typedef struct DwarfStack DwarfStack;
typedef struct DwarfParam DwarfParam;
typedef union DwarfVal DwarfVal;
enum
@@ -205,16 +203,6 @@ struct DwarfBlock
ulong len;
};
struct DwarfParam
{
char *name;
ulong unit;
ulong type;
ulong loctype;
ulong fde, len;
ulong value;
};
/* not for consumer use */
struct DwarfBuf
{
@@ -384,16 +372,19 @@ struct DwarfExpr
struct DwarfSym
{
DwarfAttrs attrs;
DwarfAttrs attrs;
/* not for consumer use... */
uint num;
DwarfBuf b;
int depth;
ulong unit, childoff, nextunit;
ulong aoff;
DwarfBuf b;
ulong unit;
uint uoff;
ulong aoff;
int depth;
int allunits;
ulong nextunit;
};
struct _Pe;
Dwarf *dwarfopen(struct _Pe *elf);
void dwarfclose(Dwarf*);
@@ -407,11 +398,9 @@ int dwarfenumunit(Dwarf*, ulong, DwarfSym*);
int dwarfseeksym(Dwarf*, ulong, ulong, DwarfSym*);
int dwarfenum(Dwarf*, DwarfSym*);
int dwarfnextsym(Dwarf*, DwarfSym*);
int dwarfnextsymat(Dwarf*, DwarfSym *parent, DwarfSym *child);
int dwarfpctoline(Dwarf*, DwarfSym *proc, ulong, char**, char**, ulong *);
int dwarfgetarg(Dwarf *d, const char *name, DwarfBuf *locbuf, ulong cfa, PROSSYM_REGISTERS registers, ulong *value);
int dwarfgettype(Dwarf *d, DwarfSym *param, DwarfSym *type);
int dwarfnextsymat(Dwarf*, DwarfSym*, int);
int dwarfpctoline(Dwarf*, ulong, char**, char**, char**, char **, ulong*, ulong*, ulong*);
int dwarfunwind(Dwarf*, ulong, DwarfExpr*, DwarfExpr*, DwarfExpr*, int);
ulong dwarfget1(DwarfBuf*);
ulong dwarfget2(DwarfBuf*);
ulong dwarfget4(DwarfBuf*);
@@ -422,10 +411,7 @@ ulong dwarfgetaddr(DwarfBuf*);
int dwarfgetn(DwarfBuf*, uchar*, int);
uchar *dwarfgetnref(DwarfBuf*, ulong);
char *dwarfgetstring(DwarfBuf*);
int dwarfcomputecfa(Dwarf *d, DwarfExpr *cfa, PROSSYM_REGISTERS registers, ulong *cfaLocation);
int dwarfregunwind(Dwarf *d, ulong pc, ulong fde, DwarfExpr *cfa, PROSSYM_REGISTERS registers);
int dwarfargvalue(Dwarf *d, DwarfSym *proc, ulong pc, ulong cfa, PROSSYM_REGISTERS registers, DwarfParam *parameters);
int dwarfgetparams(Dwarf *d, DwarfSym *s, ulong pc, int pnum, DwarfParam *paramblocks);
typedef struct DwarfAbbrev DwarfAbbrev;
typedef struct DwarfAttr DwarfAttr;
@@ -463,7 +449,6 @@ struct Dwarf
DwarfBlock pubtypes;
DwarfBlock ranges;
DwarfBlock str;
DwarfBlock loc;
/* little cache */
struct {
@@ -473,15 +458,14 @@ struct Dwarf
} acache;
};
struct DwarfStack
{
ulong storage[16]; // own storage
ulong *data;
ulong length, max;
};
DwarfAbbrev *dwarfgetabbrev(Dwarf*, ulong, ulong);
int dwarfgetinfounit(Dwarf*, ulong, DwarfBlock*);
extern int dwarf386nregs;
extern char *dwarf386regs[];
extern char *dwarf386fp;
#define SYMBOL_SIZE 18
#define MAXIMUM_DWARF_NAME_SIZE 64
#define MAXIMUM_COFF_SYMBOL_LENGTH 256
+86 -88
View File
@@ -25,119 +25,117 @@ DwarfAbbrev *dwarfgetabbrev(Dwarf*, ulong, ulong);
static int
loadabbrevs(Dwarf *d, ulong off, DwarfAbbrev **aa)
{
int nattr, nabbrev;
DwarfAbbrev *abbrev;
DwarfAttr *attr;
int nattr, nabbrev;
DwarfAbbrev *abbrev;
DwarfAttr *attr;
if(d->acache.off == off && d->acache.na){
*aa = d->acache.a;
return d->acache.na;
}
if(d->acache.off == off && d->acache.na){
*aa = d->acache.a;
return d->acache.na;
}
/* two passes - once to count, then allocate, then a second to copy */
if(parseabbrevs(d, off, nil, nil, &nabbrev, &nattr) < 0) {
return -1;
}
/* two passes - once to count, then allocate, then a second to copy */
if(parseabbrevs(d, off, nil, nil, &nabbrev, &nattr) < 0) {
return -1;
}
abbrev = malloc(nabbrev*sizeof(DwarfAbbrev) + nattr*sizeof(DwarfAttr));
attr = (DwarfAttr*)(abbrev+nabbrev);
abbrev = malloc(nabbrev*sizeof(DwarfAbbrev) + nattr*sizeof(DwarfAttr));
attr = (DwarfAttr*)(abbrev+nabbrev);
if(parseabbrevs(d, off, abbrev, attr, nil, nil) < 0){
free(abbrev);
return -1;
}
if(parseabbrevs(d, off, abbrev, attr, nil, nil) < 0){
free(abbrev);
return -1;
}
free(d->acache.a);
d->acache.a = abbrev;
d->acache.na = nabbrev;
d->acache.off = off;
free(d->acache.a);
d->acache.a = abbrev;
d->acache.na = nabbrev;
d->acache.off = off;
*aa = abbrev;
return nabbrev;
*aa = abbrev;
return nabbrev;
}
static int
parseabbrevs(Dwarf *d, ulong off, DwarfAbbrev *abbrev, DwarfAttr *attr, int *pnabbrev, int *pnattr)
{
int i, nabbrev, nattr, haskids;
ulong num, tag, name, form;
DwarfBuf b;
int i, nabbrev, nattr, haskids;
ulong num, tag, name, form;
DwarfBuf b;
if(off >= d->abbrev.len){
werrstr("bad abbrev section offset 0x%lux >= 0x%lux", off, d->abbrev.len);
return -1;
}
if(off >= d->abbrev.len){
werrstr("bad abbrev section offset 0x%lux >= 0x%lux\n", off, d->abbrev.len);
return -1;
}
memset(&b, 0, sizeof b);
b.p = d->abbrev.data + off;
b.ep = d->abbrev.data + d->abbrev.len;
memset(&b, 0, sizeof b);
b.p = d->abbrev.data + off;
b.ep = d->abbrev.data + d->abbrev.len;
nabbrev = 0;
nattr = 0;
for(;;){
if(b.p == nil){
werrstr("malformed abbrev data");
return -1;
}
num = dwarfget128(&b);
if(num == 0)
break;
tag = dwarfget128(&b);
DPRINT("num %d tag %x @ %x", num, tag, b.p - d->abbrev.data);
haskids = dwarfget1(&b);
for(i=0;; i++){
name = dwarfget128(&b);
form = dwarfget128(&b);
assert(form < 0x3000);
if(name == 0 && form == 0)
break;
if(attr){
attr[i].name = name;
attr[i].form = form;
}
}
if(abbrev){
abbrev->num = num;
abbrev->tag = tag;
abbrev->haskids = haskids;
abbrev->attr = attr;
abbrev->nattr = i;
abbrev++;
attr += i;
}
nabbrev++;
nattr += i;
}
if(pnabbrev)
*pnabbrev = nabbrev;
if(pnattr)
*pnattr = nattr;
return 0;
nabbrev = 0;
nattr = 0;
for(;;){
if(b.p == nil){
werrstr("malformed abbrev data");
return -1;
}
num = dwarfget128(&b);
if(num == 0)
break;
tag = dwarfget128(&b);
haskids = dwarfget1(&b);
for(i=0;; i++){
name = dwarfget128(&b);
form = dwarfget128(&b);
if(name == 0 && form == 0)
break;
if(attr){
attr[i].name = name;
attr[i].form = form;
}
}
if(abbrev){
abbrev->num = num;
abbrev->tag = tag;
abbrev->haskids = haskids;
abbrev->attr = attr;
abbrev->nattr = i;
abbrev++;
attr += i;
}
nabbrev++;
nattr += i;
}
if(pnabbrev)
*pnabbrev = nabbrev;
if(pnattr)
*pnattr = nattr;
return 0;
}
static DwarfAbbrev*
findabbrev(DwarfAbbrev *a, int na, ulong num)
{
int i;
int i;
for(i=0; i<na; i++)
if(a[i].num == num)
return &a[i];
assert(0);
werrstr("abbrev not found");
return nil;
for(i=0; i<na; i++)
if(a[i].num == num)
return &a[i];
werrstr("abbrev not found");
return nil;
}
DwarfAbbrev*
dwarfgetabbrev(Dwarf *d, ulong off, ulong num)
{
DwarfAbbrev *a;
int na;
DwarfAbbrev *a;
int na;
if((na = loadabbrevs(d, off, &a)) < 0){
werrstr("loadabbrevs: %r");
return nil;
}
return findabbrev(a, na, num);
if((na = loadabbrevs(d, off, &a)) < 0){
werrstr("loadabbrevs: %r");
return nil;
}
return findabbrev(a, na, num);
}
+50 -48
View File
@@ -16,54 +16,56 @@
int
dwarfaddrtounit(Dwarf *d, ulong addr, ulong *unit)
{
DwarfBuf b;
int segsize, i;
ulong len, id, off, base, size;
uchar *start, *end;
DwarfBuf b;
int segsize, i;
ulong len, id, off, base, size;
uchar *start, *end;
memset(&b, 0, sizeof b);
b.d = d;
b.p = d->aranges.data;
b.ep = b.p + d->aranges.len;
memset(&b, 0, sizeof b);
b.d = d;
b.p = d->aranges.data;
b.ep = b.p + d->aranges.len;
while(b.p < b.ep){
start = b.p;
len = dwarfget4(&b);
if (!len) { b.ep = b.p - 4; return -1; }
if((id = dwarfget2(&b)) != 2){
if(b.p == nil){
underflow:
werrstr("buffer underflow reading address ranges header");
}else
werrstr("bad dwarf version 0x%x in address ranges header", id);
return -1;
}
off = dwarfget4(&b);
b.addrsize = dwarfget1(&b);
if(d->addrsize == 0)
d->addrsize = b.addrsize;
segsize = dwarfget1(&b);
USED(segsize); /* what am i supposed to do with this? */
if(b.p == nil)
goto underflow;
if((i = (b.p-start) % (2*b.addrsize)) != 0)
b.p += 2*b.addrsize - i;
end = start+4+len;
while(b.p!=nil && b.p<end){
base = dwarfgetaddr(&b);
size = dwarfgetaddr(&b);
if (!size) continue;
if(b.p == nil)
goto underflow;
if(base <= addr && addr < base+size){
*unit = off;
return 0;
}
}
if(b.p == nil)
goto underflow;
b.p = end;
}
werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
return -1;
while(b.p < b.ep){
start = b.p;
len = dwarfget4(&b);
if (!len) { b.ep = b.p - 4; return -1; }
if((id = dwarfget2(&b)) != 2){
if(b.p == nil){
underflow:
werrstr("buffer underflow reading address ranges header");
}else
werrstr("bad dwarf version 0x%x in address ranges header", id);
return -1;
}
off = dwarfget4(&b);
b.addrsize = dwarfget1(&b);
if(d->addrsize == 0)
d->addrsize = b.addrsize;
segsize = dwarfget1(&b);
USED(segsize); /* what am i supposed to do with this? */
if(b.p == nil)
goto underflow;
if((i = (b.p-start) % (2*b.addrsize)) != 0)
b.p += 2*b.addrsize - i;
end = start+4+len;
while(b.p!=nil && b.p<end){
base = dwarfgetaddr(&b);
size = dwarfgetaddr(&b);
if (!size) continue;
if(b.p == nil)
goto underflow;
if(base <= addr && addr < base+size){
*unit = off;
return 0;
}
}
if(b.p == nil)
goto underflow;
b.p = end;
}
werrstr("address 0x%lux is not listed in dwarf debugging symbols", addr);
return -1;
}
+26 -117
View File
@@ -17,10 +17,9 @@
#define NDEBUG
#include <debug.h>
#include "pe.h"
#include "dwarf.h"
#define trace 1
#define trace 0
typedef struct State State;
struct State
@@ -72,7 +71,7 @@ dwarfunwind(Dwarf *d, ulong pc, DwarfExpr *cfa, DwarfExpr *ra, DwarfExpr *r, int
memset(r, 0, nr*sizeof(r[0]));
for(i=0; i<nr; i++)
r[i].type = RuleSame;
if(trace) werrstr("s.init %p-%p, fde %p-%p", s.init.p, s.init.ep, fde.p, fde.ep);
if(trace) werrstr("s.init %p-%p, fde %p-%p\n", s.init.p, s.init.ep, fde.p, fde.ep);
b = s.init;
if(dexec(&b, &s, 0) < 0)
goto err;
@@ -80,9 +79,9 @@ dwarfunwind(Dwarf *d, ulong pc, DwarfExpr *cfa, DwarfExpr *ra, DwarfExpr *r, int
s.initr = initr;
memmove(initr, r, nr*sizeof(initr[0]));
if(trace) werrstr("s.loc 0x%lx pc 0x%lx", s.loc, pc);
if(trace) werrstr("s.loc 0x%lux pc 0x%lux\n", s.loc, pc);
while(s.loc < pc){
if(trace) werrstr("s.loc 0x%lx pc 0x%lx", s.loc, pc);
if(trace) werrstr("s.loc 0x%lux pc 0x%lux\n", s.loc, pc);
if(dexec(&fde, &s, 1) < 0)
goto err;
}
@@ -140,16 +139,15 @@ findfde(Dwarf *d, ulong pc, State *s, DwarfBuf *fde)
id = dwarfget4(&b);
if(id == 0xFFFFFFFF){ /* CIE */
vers = dwarfget1(&b);
if (trace) werrstr("CIE len %x id %x vers %x", len, id, vers);
if(vers != 1 && vers != 2 && vers != 3){
if(++nbad == 1)
werrstr("unknown cie version %d (wanted 1-3)", vers);
werrstr("unknown cie version %d (wanted 1-3)\n", vers);
continue;
}
aug = dwarfgetstring(&b);
if(aug && *aug){
if(++nbad == 1)
werrstr("unknown augmentation: %s", aug);
werrstr("unknown augmentation: %s\n", aug);
continue;
}
s->iquantum = dwarfget128(&b);
@@ -165,7 +163,6 @@ findfde(Dwarf *d, ulong pc, State *s, DwarfBuf *fde)
}else{ /* FDE */
base = dwarfgetaddr(&b);
size = dwarfgetaddr(&b);
if (trace) werrstr("FDE: base %x-%x (want pc %x)", base, base+size, pc);
fde->p = b.p;
fde->ep = next;
s->loc = base;
@@ -174,7 +171,7 @@ findfde(Dwarf *d, ulong pc, State *s, DwarfBuf *fde)
return 0;
}
}
werrstr("cannot find call frame information for pc 0x%lx", pc);
werrstr("cannot find call frame information for pc 0x%lux", pc);
return -1;
}
@@ -183,7 +180,7 @@ static int
checkreg(State *s, long r)
{
if(r < 0 || r >= s->nr){
werrstr("bad register number 0x%lx", r);
werrstr("bad register number 0x%lux", r);
return -1;
}
return 0;
@@ -200,21 +197,20 @@ dexec(DwarfBuf *b, State *s, int locstop)
if(b->p == b->ep){
if(s->initr)
s->loc = s->endloc;
werrstr("end dexec");
return 0;
}
c = dwarfget1(b);
if(b->p == nil){
werrstr("ran out of instructions during cfa program");
if(trace) werrstr("%r");
if(trace) werrstr("%r\n");
return -1;
}
if(trace) werrstr("+ loc=0x%x op 0x%x ", s->loc, c);
if(trace) werrstr("+ loc=0x%lux op 0x%ux ", s->loc, c);
switch(c>>6){
case 1: /* advance location */
arg1 = c&0x3F;
advance:
if(trace) werrstr("loc += %ld", arg1*s->iquantum);
if(trace) werrstr("loc += %ld\n", arg1*s->iquantum);
s->loc += arg1 * s->iquantum;
if(locstop)
return 0;
@@ -224,7 +220,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
arg1 = c&0x3F;
arg2 = dwarfget128(b);
offset:
if(trace) werrstr("r%ld += %ld", arg1, arg2*s->dquantum);
if(trace) werrstr("r%ld += %ld\n", arg1, arg2*s->dquantum);
if(checkreg(s, arg1) < 0)
return -1;
s->r[arg1].type = RuleCfaOffset;
@@ -234,7 +230,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 3: /* restore initial setting */
arg1 = c&0x3F;
restore:
if(trace) werrstr("r%ld = init", arg1);
if(trace) werrstr("r%ld = init\n", arg1);
if(checkreg(s, arg1) < 0)
return -1;
s->r[arg1] = s->initr[arg1];
@@ -243,12 +239,12 @@ dexec(DwarfBuf *b, State *s, int locstop)
switch(c){
case 0: /* nop */
if(trace) werrstr("nop");
if(trace) werrstr("nop\n");
continue;
case 0x01: /* set location */
s->loc = dwarfgetaddr(b);
if(trace) werrstr("loc = 0x%lx", s->loc);
if(trace) werrstr("loc = 0x%lux\n", s->loc);
if(locstop)
return 0;
continue;
@@ -276,7 +272,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x07: /* undefined */
arg1 = dwarfget128(b);
if(trace) werrstr("r%ld = undef", arg1);
if(trace) werrstr("r%ld = undef\n", arg1);
if(checkreg(s, arg1) < 0)
return -1;
s->r[arg1].type = RuleUndef;
@@ -284,7 +280,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x08: /* same value */
arg1 = dwarfget128(b);
if(trace) werrstr("r%ld = same", arg1);
if(trace) werrstr("r%ld = same\n", arg1);
if(checkreg(s, arg1) < 0)
return -1;
s->r[arg1].type = RuleSame;
@@ -293,7 +289,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x09: /* register */
arg1 = dwarfget128(b);
arg2 = dwarfget128(b);
if(trace) werrstr("r%ld = r%ld", arg1, arg2);
if(trace) werrstr("r%ld = r%ld\n", arg1, arg2);
if(checkreg(s, arg1) < 0 || checkreg(s, arg2) < 0)
return -1;
s->r[arg1].type = RuleRegister;
@@ -302,7 +298,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x0A: /* remember state */
e = malloc(s->nr*sizeof(e[0]));
if(trace) werrstr("push");
if(trace) werrstr("push\n");
if(e == nil)
return -1;
void *newstack = malloc(s->nstack*sizeof(s->stack[0]));
@@ -323,7 +319,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
continue;
case 0x0B: /* restore state */
if(trace) werrstr("pop");
if(trace) werrstr("pop\n");
if(s->nstack == 0){
werrstr("restore state underflow");
return -1;
@@ -338,7 +334,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
arg1 = dwarfget128(b);
arg2 = dwarfget128(b);
defcfa:
if(trace) werrstr("cfa %ld(r%ld)", arg2, arg1);
if(trace) werrstr("cfa %ld(r%ld)\n", arg2, arg1);
if(checkreg(s, arg1) < 0)
return -1;
s->cfa->type = RuleRegOff;
@@ -348,7 +344,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x0D: /* def cfa register */
arg1 = dwarfget128(b);
if(trace) werrstr("cfa reg r%ld", arg1);
if(trace) werrstr("cfa reg r%ld\n", arg1);
if(s->cfa->type != RuleRegOff){
werrstr("change CFA register but CFA not in register+offset form");
return -1;
@@ -361,7 +357,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x0E: /* def cfa offset */
arg1 = dwarfget128(b);
cfaoffset:
if(trace) werrstr("cfa off %ld", arg1);
if(trace) werrstr("cfa off %ld\n", arg1);
if(s->cfa->type != RuleRegOff){
werrstr("change CFA offset but CFA not in register+offset form");
return -1;
@@ -370,7 +366,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
continue;
case 0x0F: /* def cfa expression */
if(trace) werrstr("cfa expr");
if(trace) werrstr("cfa expr\n");
s->cfa->type = RuleLocation;
s->cfa->loc.len = dwarfget128(b);
s->cfa->loc.data = dwarfgetnref(b, s->cfa->loc.len);
@@ -378,7 +374,7 @@ dexec(DwarfBuf *b, State *s, int locstop)
case 0x10: /* def reg expression */
arg1 = dwarfget128(b);
if(trace) werrstr("reg expr r%ld", arg1);
if(trace) werrstr("reg expr r%ld\n", arg1);
if(checkreg(s, arg1) < 0)
return -1;
s->r[arg1].type = RuleLocation;
@@ -401,98 +397,11 @@ dexec(DwarfBuf *b, State *s, int locstop)
goto cfaoffset;
default: /* unknown */
werrstr("unknown opcode 0x%x in cfa program", c);
werrstr("unknown opcode 0x%ux in cfa program", c);
return -1;
}
}
/* not reached */
}
int dwarfcomputecfa(Dwarf *d, DwarfExpr *cfa, PROSSYM_REGISTERS registers, ulong *cfaLocation)
{
switch (cfa->type) {
case RuleRegOff:
*cfaLocation = registers->Registers[cfa->reg] + cfa->offset;
werrstr("cfa reg %d (%x) offset %x = %x", cfa->reg, (ulong)registers->Registers[cfa->reg], cfa->offset, cfaLocation);
break;
default:
werrstr("cfa->type %x", cfa->type);
return -1;
}
return 0;
}
int dwarfregunwind(Dwarf *d, ulong pc, ulong fde, DwarfExpr *cfa, PROSSYM_REGISTERS registers)
{
int i;
State s = { };
DwarfExpr initr[sizeof(registers->Registers) / sizeof(registers->Registers[0])] = { };
DwarfExpr r[sizeof(registers->Registers) / sizeof(registers->Registers[0])] = { };
DwarfExpr ra;
int nr = s.nr = sizeof(registers->Registers) / sizeof(registers->Registers[0]);
s.initr = initr;
s.r = r;
for (i = 0; i < sizeof(r) / sizeof(r[0]); i++) {
r[i].type = RuleRegister;
r[i].offset = registers->Registers[i];
r[i].reg = i;
}
int res = dwarfunwind(d, pc, cfa, &ra, initr, sizeof(initr) / sizeof(initr[0]));
if (res == -1) return -1;
ulong cfaLocation;
if (dwarfcomputecfa(d, cfa, registers, &cfaLocation) == -1)
return -1;
for (i = 0; i < nr; i++) {
switch (r[i].type) {
case RuleUndef:
werrstr("Undefined register slot %d", i);
assert(FALSE);
break;
case RuleSame:
break;
case RuleRegister:
registers->Registers[i] = registers->Registers[r[i].reg];
break;
case RuleRegOff: {
BOOLEAN success =
RosSymCallbacks.MemGetProc
(d->pe->fd,
&registers->Registers[i],
r[i].offset + registers->Registers[r[i].reg],
d->addrsize);
if (!success) return -1;
} break;
case RuleCfaOffset:
{
BOOLEAN success =
RosSymCallbacks.MemGetProc
(d->pe->fd,
&registers->Registers[i],
r[i].offset + cfaLocation,
d->addrsize);
werrstr("reg[%d] = %x: cfa offset (cfa %x, offset %x) -> @%x", i, (ulong)registers->Registers[i], cfaLocation, initr[i].offset, r[i].offset + cfaLocation);
if (!success) return -1;
} break;
default:
werrstr("We don't yet support cfa rule %d in slot %d", r[i].type, i);
assert(FALSE);
break;
}
}
ulong cfaSpace[4];
for (i = 0; i < sizeof(cfaSpace) / sizeof(cfaSpace[0]); i++) {
RosSymCallbacks.MemGetProc
(d->pe->fd, &cfaSpace[i], cfaLocation + (i * 4), d->addrsize);
}
werrstr("CFA(%x) [%08x, %08x, %08x, %08x]",
cfaLocation, cfaSpace[0], cfaSpace[1], cfaSpace[2], cfaSpace[3]);
return 0;
}
+2 -2
View File
@@ -139,7 +139,7 @@ dwarfgetaddr(DwarfBuf *b)
return dwarfget8(b);
default:
if(++nbad == 1)
werrstr("dwarf: unexpected address size %lud in dwarfgetaddr", b->addrsize);
werrstr("dwarf: unexpected address size %lud in dwarfgetaddr\n", b->addrsize);
b->p = nil;
return 0;
}
@@ -190,7 +190,7 @@ dwarfget128(DwarfBuf *b)
while(b->p<b->ep && *b->p&0x80)
b->p++;
if(++nbad == 1)
werrstr("dwarf: overflow during parsing of uleb128 integer");
werrstr("dwarf: overflow during parsing of uleb128 integer\n");
return c;
}
+531 -853
View File
File diff suppressed because it is too large Load Diff
+1 -3
View File
@@ -31,8 +31,7 @@ dwarfopen(Pe *pe)
|| pe->loadsection(pe, ".debug_aranges", &d->aranges) < 0
|| pe->loadsection(pe, ".debug_line", &d->line) < 0
|| pe->loadsection(pe, ".debug_pubnames", &d->pubnames) < 0
|| pe->loadsection(pe, ".debug_info", &d->info) < 0
|| pe->loadsection(pe, ".debug_loc", &d->loc) < 0)
|| pe->loadsection(pe, ".debug_info", &d->info) < 0)
goto err;
pe->loadsection(pe, ".debug_frame", &d->frame);
pe->loadsection(pe, ".debug_ranges", &d->ranges);
@@ -50,7 +49,6 @@ err:
free(d->ranges.data);
free(d->str.data);
free(d->info.data);
free(d->loc.data);
free(d);
return nil;
}
+336 -366
View File
@@ -27,389 +27,359 @@
enum
{
Isstmt = 1<<0,
BasicDwarfBlock = 1<<1,
EndSequence = 1<<2,
PrologueEnd = 1<<3,
EpilogueBegin = 1<<4
Isstmt = 1<<0,
BasicDwarfBlock = 1<<1,
EndSequence = 1<<2,
PrologueEnd = 1<<3,
EpilogueBegin = 1<<4
};
typedef struct State State;
struct State
{
ulong addr;
ulong file;
ulong line;
ulong column;
ulong flags;
ulong isa;
ulong addr;
ulong file;
ulong line;
ulong column;
ulong flags;
ulong isa;
};
int
dwarfpctoline(Dwarf *d, DwarfSym *proc, ulong pc, char **file, char **function, ulong *line)
dwarfpctoline(Dwarf *d, ulong pc, char **cdir, char **dir, char **file, char **function, ulong *line, ulong *mtime, ulong *length)
{
char *cdir;
uchar *prog, *opcount, *end, *dirs;
ulong off, unit, len, vers, x, start, lastline;
int i, first, firstline, op, a, l, quantum, isstmt, linebase, linerange, opcodebase, nf;
char *files, *s;
DwarfBuf b;
DwarfSym sym;
State emit, cur, reset;
char **f, **newf;
uchar *prog, *opcount, *end, *dirs;
ulong off, unit, len, vers, x, start, lastline;
int i, first, firstline, op, a, l, quantum, isstmt, linebase, linerange, opcodebase, nf;
char *files, *s;
DwarfBuf b;
DwarfSym sym;
State emit, cur, reset;
uchar **f, **newf;
f = nil;
memset(proc, 0, sizeof(*proc));
f = nil;
int runit = dwarfaddrtounit(d, pc, &unit);
if (runit < 0)
return -1;
int rtag = dwarflookuptag(d, unit, TagCompileUnit, &sym);
if (rtag < 0)
return -1;
if(dwarfaddrtounit(d, pc, &unit) < 0
|| dwarflookuptag(d, unit, TagCompileUnit, &sym) < 0)
return -1;
if(!sym.attrs.have.stmtlist){
werrstr("no line mapping information for 0x%x", pc);
return -1;
}
off = sym.attrs.stmtlist;
if(off >= d->line.len){
werrstr("bad stmtlist");
goto bad;
}
if(trace) werrstr("unit 0x%x stmtlist 0x%x", unit, sym.attrs.stmtlist);
memset(&b, 0, sizeof b);
b.d = d;
b.p = d->line.data + off;
b.ep = b.p + d->line.len;
b.addrsize = sym.b.addrsize; /* should i get this from somewhere else? */
len = dwarfget4(&b);
if(b.p==nil || b.p+len > b.ep || b.p+len < b.p){
werrstr("bad len");
goto bad;
}
b.ep = b.p+len;
vers = dwarfget2(&b);
if(vers != 2){
werrstr("bad dwarf version 0x%x", vers);
return -1;
}
len = dwarfget4(&b);
if(b.p==nil || b.p+len > b.ep || b.p+len < b.p){
werrstr("another bad len");
goto bad;
}
prog = b.p+len;
quantum = dwarfget1(&b);
isstmt = dwarfget1(&b);
linebase = (schar)dwarfget1(&b);
linerange = (schar)dwarfget1(&b);
opcodebase = dwarfget1(&b);
opcount = b.p-1;
dwarfgetnref(&b, opcodebase-1);
if(b.p == nil){
werrstr("bad opcode chart");
goto bad;
}
/* just skip the files and dirs for now; we'll come back */
dirs = b.p;
while (b.p && *b.p)
dwarfgetstring(&b);
dwarfget1(&b);
files = (char*)b.p;
while(b.p!=nil && *b.p!=0){
dwarfgetstring(&b);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
}
dwarfget1(&b);
/* move on to the program */
if(b.p == nil || b.p > prog){
werrstr("bad header");
goto bad;
}
b.p = prog;
reset.addr = 0;
reset.file = 1;
reset.line = 1;
reset.column = 0;
reset.flags = isstmt ? Isstmt : 0;
reset.isa = 0;
cur = reset;
emit = reset;
nf = 0;
start = 0;
if(trace) werrstr("program @ %lu ... %.*H opbase = %d", b.p - d->line.data, b.ep-b.p, b.p, opcodebase);
first = 1;
while(b.p != nil){
firstline = 0;
op = dwarfget1(&b);
if(trace) werrstr("\tline %lu, addr 0x%x, op %d %.10H", cur.line, cur.addr, op, b.p);
if(op >= opcodebase){
a = (op - opcodebase) / linerange;
l = (op - opcodebase) % linerange + linebase;
cur.line += l;
cur.addr += a * quantum;
if(trace) werrstr(" +%d,%d", a, l);
emit:
if(first){
if(cur.addr > pc){
werrstr("found wrong line mapping 0x%x for pc 0x%x", cur.addr, pc);
/* This is an overzealous check. gcc can produce discontiguous ranges
and reorder statements, so it's possible for a future line to start
ahead of pc and still find a matching one. */
/*goto out;*/
firstline = 1;
}
first = 0;
start = cur.addr;
}
if(cur.addr > pc && !firstline)
break;
if(b.p == nil){
werrstr("buffer underflow in line mapping");
goto out;
}
emit = cur;
if(emit.flags & EndSequence){
werrstr("found wrong line mapping 0x%x-0x%x for pc 0x%x", start, cur.addr, pc);
goto out;
}
cur.flags &= ~(BasicDwarfBlock|PrologueEnd|EpilogueBegin);
}else{
switch(op){
case 0: /* extended op code */
if(trace) werrstr(" ext");
len = dwarfget128(&b);
end = b.p+len;
if(b.p == nil || end > b.ep || end < b.p || len < 1)
goto bad;
switch(dwarfget1(&b)){
case 1: /* end sequence */
if(trace) werrstr(" end");
cur.flags |= EndSequence;
goto emit;
case 2: /* set address */
cur.addr = dwarfgetaddr(&b);
if(trace) werrstr(" set pc 0x%x", cur.addr);
break;
case 3: /* define file */
newf = malloc(nf+1*sizeof(f[0]));
if (newf)
RtlMoveMemory(newf, f, nf*sizeof(f[0]));
if(newf == nil)
goto out;
free(f);
f = newf;
f[nf++] = s = dwarfgetstring(&b);
DPRINT1("str %s", s);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
if(trace) werrstr(" def file %s", s);
break;
}
if(b.p == nil || b.p > end)
goto bad;
b.p = end;
break;
case 1: /* emit */
if(trace) werrstr(" emit");
goto emit;
case 2: /* advance pc */
a = dwarfget128(&b);
if(trace) werrstr(" advance pc + %lu", a*quantum);
cur.addr += a * quantum;
break;
case 3: /* advance line */
l = dwarfget128s(&b);
if(trace) werrstr(" advance line + %ld", l);
cur.line += l;
break;
case 4: /* set file */
if(trace) werrstr(" set file");
cur.file = dwarfget128s(&b);
break;
case 5: /* set column */
if(trace) werrstr(" set column");
cur.column = dwarfget128(&b);
break;
case 6: /* negate stmt */
if(trace) werrstr(" negate stmt");
cur.flags ^= Isstmt;
break;
case 7: /* set basic block */
if(trace) werrstr(" set basic block");
cur.flags |= BasicDwarfBlock;
break;
case 8: /* const add pc */
a = (255 - opcodebase) / linerange * quantum;
if(trace) werrstr(" const add pc + %d", a);
cur.addr += a;
break;
case 9: /* fixed advance pc */
a = dwarfget2(&b);
if(trace) werrstr(" fixed advance pc + %d", a);
cur.addr += a;
break;
case 10: /* set prologue end */
if(trace) werrstr(" set prologue end");
cur.flags |= PrologueEnd;
break;
case 11: /* set epilogue begin */
if(trace) werrstr(" set epilogue begin");
cur.flags |= EpilogueBegin;
break;
case 12: /* set isa */
if(trace) werrstr(" set isa");
cur.isa = dwarfget128(&b);
break;
default: /* something new - skip it */
if(trace) werrstr(" unknown %d", opcount[op]);
for(i=0; i<opcount[op]; i++)
dwarfget128(&b);
break;
}
}
}
if(b.p == nil)
goto bad;
/* finally! the data we seek is in "emit" */
if(emit.file == 0){
werrstr("invalid file index in mapping data");
goto out;
}
if(line)
*line = emit.line;
/* skip over first emit.file-2 guys */
b.p = (uchar*)files;
for(i=emit.file-1; i > 0 && b.p!=nil && *b.p!=0; i--){
dwarfgetstring(&b);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
}
if(b.p == nil){
werrstr("problem parsing file data second time (cannot happen)");
goto bad;
}
if(*b.p == 0){
if(i >= nf){
werrstr("bad file index in mapping data");
goto bad;
}
b.p = (uchar*)f[i];
}
s = dwarfgetstring(&b);
*file = s;
i = dwarfget128(&b); /* directory */
x = dwarfget128(&b);
x = dwarfget128(&b);
/* fetch dir name */
cdir = sym.attrs.have.compdir ? sym.attrs.compdir : 0;
char *dwarfdir;
dwarfdir = nil;
b.p = dirs;
for (x = 1; b.p && *b.p; x++) {
dwarfdir = dwarfgetstring(&b);
if (x == i) break;
if(!sym.attrs.have.stmtlist){
werrstr("no line mapping information for 0x%x", pc);
return -1;
}
off = sym.attrs.stmtlist;
if(off >= d->line.len){
werrstr("bad stmtlist\n");
goto bad;
}
if (!cdir && dwarfdir)
cdir = dwarfdir;
char *filefull = malloc(strlen(cdir) + strlen(*file) + 2);
strcpy(filefull, cdir);
strcat(filefull, "/");
strcat(filefull, *file);
*file = filefull;
*function = nil;
lastline = 0;
runit = dwarfaddrtounit(d, pc, &unit);
if (runit == 0) {
DwarfSym compunit = { };
int renum = dwarfenumunit(d, unit, &compunit);
if (renum < 0)
return -1;
renum = dwarfnextsymat(d, &compunit, proc);
while (renum == 0) {
if (proc->attrs.tag == TagSubprogram &&
proc->attrs.have.name)
{
if (proc->attrs.lowpc <= pc && proc->attrs.highpc > pc) {
*function = malloc(strlen(proc->attrs.name)+1);
strcpy(*function, proc->attrs.name);
goto done;
}
}
renum = dwarfnextsym(d, proc);
}
}
if(trace) werrstr("unit 0x%x stmtlist 0x%x", unit, sym.attrs.stmtlist);
// Next search by declaration
runit = dwarfaddrtounit(d, pc, &unit);
if (runit == 0) {
DwarfSym compunit = { };
int renum = dwarfenumunit(d, unit, &compunit);
if (renum < 0)
return -1;
renum = dwarfnextsymat(d, &compunit, proc);
while (renum == 0) {
if (proc->attrs.tag == TagSubprogram &&
proc->attrs.have.name &&
proc->attrs.declfile == emit.file)
{
if (proc->attrs.declline <= *line &&
proc->attrs.declline > lastline) {
free(*function);
*function = malloc(strlen(proc->attrs.name)+1);
strcpy(*function, proc->attrs.name);
goto done;
}
lastline = proc->attrs.declline;
}
renum = dwarfnextsym(d, proc);
}
}
memset(&b, 0, sizeof b);
b.d = d;
b.p = d->line.data + off;
b.ep = b.p + d->line.len;
b.addrsize = sym.b.addrsize; /* should i get this from somewhere else? */
len = dwarfget4(&b);
if(b.p==nil || b.p+len > b.ep || b.p+len < b.p){
werrstr("bad len\n");
goto bad;
}
b.ep = b.p+len;
vers = dwarfget2(&b);
if(vers != 2){
werrstr("bad dwarf version 0x%x", vers);
return -1;
}
len = dwarfget4(&b);
if(b.p==nil || b.p+len > b.ep || b.p+len < b.p){
werrstr("another bad len\n");
goto bad;
}
prog = b.p+len;
quantum = dwarfget1(&b);
isstmt = dwarfget1(&b);
linebase = (schar)dwarfget1(&b);
linerange = (schar)dwarfget1(&b);
opcodebase = dwarfget1(&b);
opcount = b.p-1;
dwarfgetnref(&b, opcodebase-1);
if(b.p == nil){
werrstr("bad opcode chart\n");
goto bad;
}
/* just skip the files and dirs for now; we'll come back */
dirs = b.p;
while (b.p && *b.p)
dwarfgetstring(&b);
dwarfget1(&b);
files = (char*)b.p;
while(b.p!=nil && *b.p!=0){
dwarfgetstring(&b);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
}
dwarfget1(&b);
/* move on to the program */
if(b.p == nil || b.p > prog){
werrstr("bad header\n");
goto bad;
}
b.p = prog;
reset.addr = 0;
reset.file = 1;
reset.line = 1;
reset.column = 0;
reset.flags = isstmt ? Isstmt : 0;
reset.isa = 0;
cur = reset;
emit = reset;
nf = 0;
start = 0;
if(trace) werrstr("program @ %lu ... %.*H opbase = %d\n", b.p - d->line.data, b.ep-b.p, b.p, opcodebase);
first = 1;
while(b.p != nil){
firstline = 0;
op = dwarfget1(&b);
if(trace) werrstr("\tline %lu, addr 0x%x, op %d %.10H", cur.line, cur.addr, op, b.p);
if(op >= opcodebase){
a = (op - opcodebase) / linerange;
l = (op - opcodebase) % linerange + linebase;
cur.line += l;
cur.addr += a * quantum;
if(trace) werrstr(" +%d,%d\n", a, l);
emit:
if(first){
if(cur.addr > pc){
werrstr("found wrong line mapping 0x%x for pc 0x%x", cur.addr, pc);
/* This is an overzealous check. gcc can produce discontiguous ranges
and reorder statements, so it's possible for a future line to start
ahead of pc and still find a matching one. */
/*goto out;*/
firstline = 1;
}
first = 0;
start = cur.addr;
}
if(cur.addr > pc && !firstline)
break;
if(b.p == nil){
werrstr("buffer underflow in line mapping");
goto out;
}
emit = cur;
if(emit.flags & EndSequence){
werrstr("found wrong line mapping 0x%x-0x%x for pc 0x%x", start, cur.addr, pc);
goto out;
}
cur.flags &= ~(BasicDwarfBlock|PrologueEnd|EpilogueBegin);
}else{
switch(op){
case 0: /* extended op code */
if(trace) werrstr(" ext");
len = dwarfget128(&b);
end = b.p+len;
if(b.p == nil || end > b.ep || end < b.p || len < 1)
goto bad;
switch(dwarfget1(&b)){
case 1: /* end sequence */
if(trace) werrstr(" end\n");
cur.flags |= EndSequence;
goto emit;
case 2: /* set address */
cur.addr = dwarfgetaddr(&b);
if(trace) werrstr(" set pc 0x%x\n", cur.addr);
break;
case 3: /* define file */
newf = malloc(nf+1*sizeof(f[0]));
if (newf)
RtlMoveMemory(newf, f, nf*sizeof(f[0]));
if(newf == nil)
goto out;
f[nf++] = b.p;
s = dwarfgetstring(&b);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
if(trace) werrstr(" def file %s\n", s);
break;
}
if(b.p == nil || b.p > end)
goto bad;
b.p = end;
break;
case 1: /* emit */
if(trace) werrstr(" emit\n");
goto emit;
case 2: /* advance pc */
a = dwarfget128(&b);
if(trace) werrstr(" advance pc + %lu\n", a*quantum);
cur.addr += a * quantum;
break;
case 3: /* advance line */
l = dwarfget128s(&b);
if(trace) werrstr(" advance line + %ld\n", l);
cur.line += l;
break;
case 4: /* set file */
if(trace) werrstr(" set file\n");
cur.file = dwarfget128s(&b);
break;
case 5: /* set column */
if(trace) werrstr(" set column\n");
cur.column = dwarfget128(&b);
break;
case 6: /* negate stmt */
if(trace) werrstr(" negate stmt\n");
cur.flags ^= Isstmt;
break;
case 7: /* set basic block */
if(trace) werrstr(" set basic block\n");
cur.flags |= BasicDwarfBlock;
break;
case 8: /* const add pc */
a = (255 - opcodebase) / linerange * quantum;
if(trace) werrstr(" const add pc + %d\n", a);
cur.addr += a;
break;
case 9: /* fixed advance pc */
a = dwarfget2(&b);
if(trace) werrstr(" fixed advance pc + %d\n", a);
cur.addr += a;
break;
case 10: /* set prologue end */
if(trace) werrstr(" set prologue end\n");
cur.flags |= PrologueEnd;
break;
case 11: /* set epilogue begin */
if(trace) werrstr(" set epilogue begin\n");
cur.flags |= EpilogueBegin;
break;
case 12: /* set isa */
if(trace) werrstr(" set isa\n");
cur.isa = dwarfget128(&b);
break;
default: /* something new - skip it */
if(trace) werrstr(" unknown %d\n", opcount[op]);
for(i=0; i<opcount[op]; i++)
dwarfget128(&b);
break;
}
}
}
if(b.p == nil)
goto bad;
/* finally! the data we seek is in "emit" */
if(emit.file == 0){
werrstr("invalid file index in mapping data");
goto out;
}
if(line)
*line = emit.line;
/* skip over first emit.file-2 guys */
b.p = (uchar*)files;
for(i=emit.file-1; i > 0 && b.p!=nil && *b.p!=0; i--){
dwarfgetstring(&b);
dwarfget128(&b);
dwarfget128(&b);
dwarfget128(&b);
}
if(b.p == nil){
werrstr("problem parsing file data second time (cannot happen)");
goto bad;
}
if(*b.p == 0){
if(i >= nf){
werrstr("bad file index in mapping data");
goto bad;
}
b.p = f[i];
}
s = dwarfgetstring(&b);
if(file)
*file = s;
i = dwarfget128(&b); /* directory */
x = dwarfget128(&b);
if(mtime)
*mtime = x;
x = dwarfget128(&b);
if(length)
*length = x;
/* fetch dir name */
if(cdir)
*cdir = sym.attrs.compdir;
if(dir){
*dir = nil;
b.p = dirs;
for (x = 1; b.p && *b.p; x++)
if (x == i) {
*dir = dwarfgetstring(&b);
break;
}
}
*function = nil;
lastline = 0;
#if 0
if (dwarfenumunit(d, unit, &proc) >= 0) {
dwarfnextsymat(d, &proc, 0);
while (dwarfnextsymat(d, &proc, 1) == 1) {
if (proc.attrs.tag == TagSubprogram &&
proc.attrs.have.name &&
proc.attrs.declfile == emit.file &&
proc.attrs.declline <= *line &&
proc.attrs.declline > lastline) {
lastline = proc.attrs.declline;
free(*function);
*function = malloc(strlen(proc.attrs.name)+1);
strcpy(*function, proc.attrs.name);
}
}
}
#elif 1
ulong lastaddr = 0;
*function = NULL;
for (i = 0; i < d->pe->nsymbols; i++) {
if (d->pe->symtab[i].address > lastaddr &&
d->pe->symtab[i].address <= pc - d->pe->imagebase &&
d->pe->symtab[i].address < d->pe->imagesize) {
lastaddr = d->pe->symtab[i].address;
*function = d->pe->symtab[i].name;
}
}
#else
// *sigh* we get unrelocated low_pc and high_pc because the dwarf symbols
// are not 'loaded' in the PE sense.
if (dwarflookupfn(d, unit, pc, &proc) >= 0) {
*function = malloc(strlen(proc.attrs.name)+1);
strcpy(*function, proc.attrs.name);
}
#endif
/* free at last, free at last */
free(f);
return 0;
/* free at last, free at last */
done:
free(f);
return 0;
bad:
werrstr("corrupted line mapping for 0x%x", pc);
werrstr("corrupted line mapping for 0x%x", pc);
out:
free(f);
return -1;
free(f);
return -1;
}
VOID RosSymFreeInfo(PROSSYM_LINEINFO LineInfo)
{
int i;
free(LineInfo->FileName);
LineInfo->FileName = NULL;
free(LineInfo->FunctionName);
LineInfo->FunctionName = NULL;
for (i = 0; i < sizeof(LineInfo->Parameters)/sizeof(LineInfo->Parameters[0]); i++)
free(LineInfo->Parameters[i].ValueName);
}
+90 -73
View File
@@ -42,90 +42,107 @@
#define NDEBUG
#include <debug.h>
#include "rossym.h"
#include "dwarf.h"
#include "pe.h"
static PROSSYM_ENTRY
FindEntry(IN PROSSYM_INFO RosSymInfo, IN ULONG_PTR RelativeAddress)
{
/*
* Perform a binary search.
*
* The code below is a bit sneaky. After a comparison fails, we
* divide the work in half by moving either left or right. If lim
* is odd, moving left simply involves halving lim: e.g., when lim
* is 5 we look at item 2, so we change lim to 2 so that we will
* look at items 0 & 1. If lim is even, the same applies. If lim
* is odd, moving right again involes halving lim, this time moving
* the base up one item past p: e.g., when lim is 5 we change base
* to item 3 and make lim 2 so that we will look at items 3 and 4.
* If lim is even, however, we have to shrink it by one before
* halving: e.g., when lim is 4, we still looked at item 2, so we
* have to make lim 3, then halve, obtaining 1, so that we will only
* look at item 3.
*/
PROSSYM_ENTRY Base = RosSymInfo->Symbols;
ULONG Lim;
PROSSYM_ENTRY Mid, Low;
if (RelativeAddress < Base->Address)
{
return NULL;
}
Low = Base;
for (Lim = RosSymInfo->SymbolsCount; Lim != 0; Lim >>= 1)
{
Mid = Base + (Lim >> 1);
if (RelativeAddress == Mid->Address)
{
return Mid;
}
if (Mid->Address < RelativeAddress) /* key > mid: move right */
{
Low = Mid;
Base = Mid + 1;
Lim--;
} /* else move left */
}
return Low;
}
BOOLEAN
RosSymGetAddressInformation
(PROSSYM_INFO RosSymInfo,
ULONG_PTR RelativeAddress,
PROSSYM_LINEINFO RosSymLineInfo)
RosSymGetAddressInformation(PROSSYM_INFO RosSymInfo,
ULONG_PTR RelativeAddress,
ULONG *LineNumber,
char *FileName,
char *FunctionName)
{
ROSSYM_REGISTERS registers;
DwarfParam params[sizeof(RosSymLineInfo->Parameters)/sizeof(RosSymLineInfo->Parameters[0])];
DwarfSym proc = { };
int i;
int res = dwarfpctoline
(RosSymInfo,
&proc,
RelativeAddress + RosSymInfo->pe->imagebase,
&RosSymLineInfo->FileName,
&RosSymLineInfo->FunctionName,
&RosSymLineInfo->LineNumber);
if (res == -1) {
werrstr("Could not get basic function info");
return FALSE;
PROSSYM_ENTRY RosSymEntry;
DPRINT("RelativeAddress = 0x%08x\n", RelativeAddress);
if (RosSymInfo->Symbols == NULL || RosSymInfo->SymbolsCount == 0 ||
RosSymInfo->Strings == NULL || RosSymInfo->StringsLength == 0)
{
DPRINT1("Uninitialized RosSymInfo\n");
return FALSE;
}
if (!(RosSymLineInfo->Flags & ROSSYM_LINEINFO_HAS_REGISTERS))
return TRUE;
ASSERT(LineNumber || FileName || FunctionName);
registers = RosSymLineInfo->Registers;
/* find symbol entry for function */
RosSymEntry = FindEntry(RosSymInfo, RelativeAddress);
DwarfExpr cfa = { };
ulong cfaLocation;
if (dwarfregunwind
(RosSymInfo,
RelativeAddress + RosSymInfo->pe->imagebase,
proc.attrs.framebase.c,
&cfa,
&registers) == -1) {
werrstr("Can't get cfa location for %s", RosSymLineInfo->FunctionName);
return TRUE;
if (NULL == RosSymEntry)
{
DPRINT("None of the requested information was found!\n");
return FALSE;
}
res = dwarfgetparams
(RosSymInfo,
&proc,
RelativeAddress + RosSymInfo->pe->imagebase,
sizeof(params)/sizeof(params[0]),
params);
if (res == -1) {
werrstr("%s: could not get params at all", RosSymLineInfo->FunctionName);
RosSymLineInfo->NumParams = 0;
return TRUE;
if (LineNumber != NULL)
{
*LineNumber = RosSymEntry->SourceLine;
}
if (FileName != NULL)
{
PCSTR Name = "";
if (RosSymEntry->FileOffset != 0)
{
Name = (PCHAR) RosSymInfo->Strings + RosSymEntry->FileOffset;
}
strcpy(FileName, Name);
}
if (FunctionName != NULL)
{
PCSTR Name = "";
if (RosSymEntry->FunctionOffset != 0)
{
Name = (PCHAR) RosSymInfo->Strings + RosSymEntry->FunctionOffset;
}
strcpy(FunctionName, Name);
}
werrstr("%s: res %d", RosSymLineInfo->FunctionName, res);
RosSymLineInfo->NumParams = res;
res = dwarfcomputecfa(RosSymInfo, &cfa, &registers, &cfaLocation);
if (res == -1) {
werrstr("%s: could not get our own cfa", RosSymLineInfo->FunctionName);
return TRUE;
}
for (i = 0; i < RosSymLineInfo->NumParams; i++) {
werrstr("Getting arg %s, unit %x, type %x",
params[i].name, params[i].unit, params[i].type);
res = dwarfargvalue
(RosSymInfo,
&proc,
RelativeAddress + RosSymInfo->pe->imagebase,
cfaLocation,
&registers,
&params[i]);
if (res == -1) { RosSymLineInfo->NumParams = i; return TRUE; }
werrstr("%s: %x", params[i].name, params[i].value);
RosSymLineInfo->Parameters[i].ValueName = malloc(strlen(params[i].name)+1);
strcpy(RosSymLineInfo->Parameters[i].ValueName, params[i].name);
free(params[i].name);
RosSymLineInfo->Parameters[i].Value = params[i].value;
}
return TRUE;
return TRUE;
}
/* EOF */
+102 -118
View File
@@ -8,156 +8,140 @@
*/
#define NTOSAPI
#include <ntifs.h>
#include <ndk/ntndk.h>
#include <ntddk.h>
#include <reactos/rossym.h>
#include "rossympriv.h"
#include "pe.h"
#include <ntimage.h>
#include "dwarf.h"
#define NDEBUG
#include <debug.h>
#define SYMBOL_SIZE 18
extern NTSTATUS RosSymStatus;
BOOLEAN
RosSymCreateFromFile(PVOID FileContext, PROSSYM_INFO *RosSymInfo)
{
IMAGE_DOS_HEADER DosHeader;
IMAGE_NT_HEADERS NtHeaders;
PIMAGE_SECTION_HEADER SectionHeaders;
unsigned SectionIndex;
unsigned SymbolTable, NumSymbols;
IMAGE_DOS_HEADER DosHeader;
IMAGE_NT_HEADERS NtHeaders;
PIMAGE_SECTION_HEADER SectionHeaders, SectionHeader;
unsigned SectionIndex;
char SectionName[IMAGE_SIZEOF_SHORT_NAME];
ROSSYM_HEADER RosSymHeader;
/* Load DOS header */
if (! RosSymSeekFile(FileContext, 0))
/* Load DOS header */
if (! RosSymReadFile(FileContext, &DosHeader, sizeof(IMAGE_DOS_HEADER)))
{
werrstr("Could not rewind file\n");
return FALSE;
DPRINT1("Failed to read DOS header\n");
return FALSE;
}
if (! RosSymReadFile(FileContext, &DosHeader, sizeof(IMAGE_DOS_HEADER)))
if (! ROSSYM_IS_VALID_DOS_HEADER(&DosHeader))
{
werrstr("Failed to read DOS header %x\n", RosSymStatus);
return FALSE;
}
if (! ROSSYM_IS_VALID_DOS_HEADER(&DosHeader))
{
werrstr("Image doesn't have a valid DOS header\n");
return FALSE;
DPRINT1("Image doesn't have a valid DOS header\n");
return FALSE;
}
/* Load NT headers */
if (! RosSymSeekFile(FileContext, DosHeader.e_lfanew))
/* Load NT headers */
if (! RosSymSeekFile(FileContext, DosHeader.e_lfanew))
{
werrstr("Failed seeking to NT headers\n");
return FALSE;
DPRINT1("Failed seeking to NT headers\n");
return FALSE;
}
if (! RosSymReadFile(FileContext, &NtHeaders, sizeof(IMAGE_NT_HEADERS)))
if (! RosSymReadFile(FileContext, &NtHeaders, sizeof(IMAGE_NT_HEADERS)))
{
werrstr("Failed to read NT headers\n");
return FALSE;
DPRINT1("Failed to read NT headers\n");
return FALSE;
}
if (! ROSSYM_IS_VALID_NT_HEADERS(&NtHeaders))
if (! ROSSYM_IS_VALID_NT_HEADERS(&NtHeaders))
{
werrstr("Image doesn't have a valid PE header\n");
return FALSE;
DPRINT1("Image doesn't have a valid PE header\n");
return FALSE;
}
SymbolTable = NtHeaders.FileHeader.PointerToSymbolTable;
NumSymbols = NtHeaders.FileHeader.NumberOfSymbols;
if (!NumSymbols)
/* Load section headers */
if (! RosSymSeekFile(FileContext, (char *) IMAGE_FIRST_SECTION(&NtHeaders) -
(char *) &NtHeaders + DosHeader.e_lfanew))
{
werrstr("Image doesn't have debug symbols\n");
return FALSE;
DPRINT1("Failed seeking to section headers\n");
return FALSE;
}
SectionHeaders = RosSymAllocMem(NtHeaders.FileHeader.NumberOfSections
* sizeof(IMAGE_SECTION_HEADER));
if (NULL == SectionHeaders)
{
DPRINT1("Failed to allocate memory for %u section headers\n",
NtHeaders.FileHeader.NumberOfSections);
return FALSE;
}
if (! RosSymReadFile(FileContext, SectionHeaders,
NtHeaders.FileHeader.NumberOfSections
* sizeof(IMAGE_SECTION_HEADER)))
{
RosSymFreeMem(SectionHeaders);
DPRINT1("Failed to read section headers\n");
return FALSE;
}
DPRINT("SymbolTable %x NumSymbols %x\n", SymbolTable, NumSymbols);
/* Load section headers */
if (! RosSymSeekFile(FileContext, (char *) IMAGE_FIRST_SECTION(&NtHeaders) -
(char *) &NtHeaders + DosHeader.e_lfanew))
/* Search for the section header */
strncpy(SectionName, ROSSYM_SECTION_NAME, IMAGE_SIZEOF_SHORT_NAME);
SectionHeader = SectionHeaders;
for (SectionIndex = 0; SectionIndex < NtHeaders.FileHeader.NumberOfSections; SectionIndex++)
{
werrstr("Failed seeking to section headers\n");
return FALSE;
}
DPRINT("Alloc section headers\n");
SectionHeaders = RosSymAllocMem(NtHeaders.FileHeader.NumberOfSections
* sizeof(IMAGE_SECTION_HEADER));
if (NULL == SectionHeaders)
{
werrstr("Failed to allocate memory for %u section headers\n",
NtHeaders.FileHeader.NumberOfSections);
return FALSE;
}
if (! RosSymReadFile(FileContext, SectionHeaders,
NtHeaders.FileHeader.NumberOfSections
* sizeof(IMAGE_SECTION_HEADER)))
{
RosSymFreeMem(SectionHeaders);
werrstr("Failed to read section headers\n");
return FALSE;
}
// Convert names to ANSI_STRINGs
for (SectionIndex = 0; SectionIndex < NtHeaders.FileHeader.NumberOfSections;
SectionIndex++)
{
ANSI_STRING astr;
if (SectionHeaders[SectionIndex].Name[0] != '/') {
DPRINT("Short name string %d, %s\n", SectionIndex, SectionHeaders[SectionIndex].Name);
astr.Buffer = RosSymAllocMem(IMAGE_SIZEOF_SHORT_NAME);
memcpy(astr.Buffer, SectionHeaders[SectionIndex].Name, IMAGE_SIZEOF_SHORT_NAME);
astr.MaximumLength = IMAGE_SIZEOF_SHORT_NAME;
astr.Length = GetStrnlen(astr.Buffer, IMAGE_SIZEOF_SHORT_NAME);
} else {
UNICODE_STRING intConv;
NTSTATUS Status;
ULONG StringOffset;
Status = RtlCreateUnicodeStringFromAsciiz(&intConv, (PCSZ)SectionHeaders[SectionIndex].Name + 1);
if (!NT_SUCCESS(Status)) goto freeall;
Status = RtlUnicodeStringToInteger(&intConv, 10, &StringOffset);
RtlFreeUnicodeString(&intConv);
if (!NT_SUCCESS(Status)) goto freeall;
if (!RosSymSeekFile(FileContext, SymbolTable + NumSymbols * SYMBOL_SIZE + StringOffset))
goto freeall;
astr.Buffer = RosSymAllocMem(MAXIMUM_DWARF_NAME_SIZE);
if (!RosSymReadFile(FileContext, astr.Buffer, MAXIMUM_DWARF_NAME_SIZE))
goto freeall;
astr.Length = GetStrnlen(astr.Buffer, MAXIMUM_DWARF_NAME_SIZE);
astr.MaximumLength = MAXIMUM_DWARF_NAME_SIZE;
DPRINT("Long name %d, %s\n", SectionIndex, astr.Buffer);
if (0 == memcmp(SectionName, SectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME))
{
break;
}
*ANSI_NAME_STRING(&SectionHeaders[SectionIndex]) = astr;
SectionHeader++;
}
if (NtHeaders.FileHeader.NumberOfSections <= SectionIndex)
{
RosSymFreeMem(SectionHeaders);
DPRINT("No %s section found\n", ROSSYM_SECTION_NAME);
return FALSE;
}
DPRINT("Done with sections\n");
Pe *pe = RosSymAllocMem(sizeof(*pe));
pe->fd = FileContext;
pe->e2 = peget2;
pe->e4 = peget4;
pe->e8 = peget8;
pe->nsections = NtHeaders.FileHeader.NumberOfSections;
pe->sect = SectionHeaders;
pe->imagebase = pe->loadbase = NtHeaders.OptionalHeader.ImageBase;
pe->imagesize = NtHeaders.OptionalHeader.SizeOfImage;
pe->loadsection = loaddisksection;
*RosSymInfo = dwarfopen(pe);
/* Load rossym header */
if (! RosSymSeekFile(FileContext, SectionHeader->PointerToRawData))
{
RosSymFreeMem(SectionHeaders);
DPRINT1("Failed seeking to section data\n");
return FALSE;
}
RosSymFreeMem(SectionHeaders);
if (! RosSymReadFile(FileContext, &RosSymHeader, sizeof(ROSSYM_HEADER)))
{
DPRINT1("Failed to read rossym header\n");
return FALSE;
}
if (RosSymHeader.SymbolsOffset < sizeof(ROSSYM_HEADER)
|| RosSymHeader.StringsOffset < RosSymHeader.SymbolsOffset + RosSymHeader.SymbolsLength
|| 0 != (RosSymHeader.SymbolsLength % sizeof(ROSSYM_ENTRY)))
{
DPRINT1("Invalid ROSSYM_HEADER\n");
return FALSE;
}
return TRUE;
*RosSymInfo = RosSymAllocMem(sizeof(ROSSYM_INFO) - sizeof(ROSSYM_HEADER)
+ RosSymHeader.StringsOffset + RosSymHeader.StringsLength + 1);
if (NULL == *RosSymInfo)
{
DPRINT1("Failed to allocate memory for rossym\n");
return FALSE;
}
(*RosSymInfo)->Symbols = (PROSSYM_ENTRY)((char *) *RosSymInfo + sizeof(ROSSYM_INFO)
- sizeof(ROSSYM_HEADER) + RosSymHeader.SymbolsOffset);
(*RosSymInfo)->SymbolsCount = RosSymHeader.SymbolsLength / sizeof(ROSSYM_ENTRY);
(*RosSymInfo)->Strings = (PCHAR) *RosSymInfo + sizeof(ROSSYM_INFO) - sizeof(ROSSYM_HEADER)
+ RosSymHeader.StringsOffset;
(*RosSymInfo)->StringsLength = RosSymHeader.StringsLength;
if (! RosSymReadFile(FileContext, *RosSymInfo + 1,
RosSymHeader.StringsOffset + RosSymHeader.StringsLength
- sizeof(ROSSYM_HEADER)))
{
DPRINT1("Failed to read rossym headers\n");
return FALSE;
}
/* Make sure the last string is null terminated, we allocated an extra byte for that */
(*RosSymInfo)->Strings[(*RosSymInfo)->StringsLength] = '\0';
freeall:
for (SectionIndex = 0; SectionIndex < NtHeaders.FileHeader.NumberOfSections;
SectionIndex++)
RtlFreeAnsiString(ANSI_NAME_STRING(&SectionHeaders[SectionIndex]));
RosSymFreeMem(SectionHeaders);
return FALSE;
return TRUE;
}
/* EOF */
+67 -136
View File
@@ -8,8 +8,7 @@
*/
#define NTOSAPI
#include <ntifs.h>
#include <ndk/ntndk.h>
#include <ntddk.h>
#include <reactos/rossym.h>
#include "rossympriv.h"
#include <ntimage.h>
@@ -17,144 +16,76 @@
#define NDEBUG
#include <debug.h>
#include "dwarf.h"
#include "pe.h"
BOOLEAN
RosSymCreateFromMem(PVOID ImageStart, ULONG_PTR ImageSize, PROSSYM_INFO *RosSymInfo)
{
ANSI_STRING AnsiNameString = { };
PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NtHeaders;
PIMAGE_SECTION_HEADER SectionHeaders;
ULONG SectionIndex;
unsigned SymbolTable, NumSymbols;
/* Check if MZ header is valid */
DosHeader = (PIMAGE_DOS_HEADER) ImageStart;
if (ImageSize < sizeof(IMAGE_DOS_HEADER)
|| ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader))
{
DPRINT1("Image doesn't have a valid DOS header\n");
return FALSE;
}
/* Locate NT header */
NtHeaders = (PIMAGE_NT_HEADERS)((char *) ImageStart + DosHeader->e_lfanew);
if (ImageSize < DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)
|| ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders))
{
DPRINT1("Image doesn't have a valid PE header\n");
return FALSE;
}
SymbolTable = NtHeaders->FileHeader.PointerToSymbolTable;
NumSymbols = NtHeaders->FileHeader.NumberOfSymbols;
/* Search for the section header */
ULONG SectionHeaderSize = NtHeaders->FileHeader.NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
SectionHeaders = RosSymAllocMem(SectionHeaderSize);
RtlCopyMemory(SectionHeaders, IMAGE_FIRST_SECTION(NtHeaders), SectionHeaderSize);
// Convert names to ANSI_STRINGs
for (SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections;
SectionIndex++)
{
if (SectionHeaders[SectionIndex].Name[0] != '/') {
AnsiNameString.Buffer = RosSymAllocMem(IMAGE_SIZEOF_SHORT_NAME);
RtlCopyMemory(AnsiNameString.Buffer, SectionHeaders[SectionIndex].Name, IMAGE_SIZEOF_SHORT_NAME);
AnsiNameString.MaximumLength = IMAGE_SIZEOF_SHORT_NAME;
AnsiNameString.Length = GetStrnlen(AnsiNameString.Buffer, IMAGE_SIZEOF_SHORT_NAME);
} else {
UNICODE_STRING intConv;
NTSTATUS Status;
ULONG StringOffset;
Status = RtlCreateUnicodeStringFromAsciiz(&intConv, (PCSZ)SectionHeaders[SectionIndex].Name + 1);
if (!NT_SUCCESS(Status)) goto freeall;
Status = RtlUnicodeStringToInteger(&intConv, 10, &StringOffset);
RtlFreeUnicodeString(&intConv);
if (!NT_SUCCESS(Status)) goto freeall;
ULONG VirtualOffset = pefindrva(SectionHeaders, NtHeaders->FileHeader.NumberOfSections, SymbolTable+(NumSymbols*SYMBOL_SIZE)+StringOffset);
if (!VirtualOffset) goto freeall;
AnsiNameString.Buffer = RosSymAllocMem(MAXIMUM_DWARF_NAME_SIZE);
if (!AnsiNameString.Buffer) goto freeall;
PCHAR StringTarget = ((PCHAR)ImageStart)+VirtualOffset;
PCHAR EndOfImage = ((PCHAR)ImageStart) + NtHeaders->OptionalHeader.SizeOfImage;
if (StringTarget >= EndOfImage) goto freeall;
ULONG PossibleStringLength = EndOfImage - StringTarget;
if (PossibleStringLength > MAXIMUM_DWARF_NAME_SIZE)
PossibleStringLength = MAXIMUM_DWARF_NAME_SIZE;
RtlCopyMemory(AnsiNameString.Buffer, StringTarget, PossibleStringLength);
AnsiNameString.Length = strlen(AnsiNameString.Buffer);
AnsiNameString.MaximumLength = MAXIMUM_DWARF_NAME_SIZE;
}
memcpy
(&SectionHeaders[SectionIndex],
&AnsiNameString,
sizeof(AnsiNameString));
}
Pe *pe = RosSymAllocMem(sizeof(*pe));
pe->fd = ImageStart;
pe->e2 = peget2;
pe->e4 = peget4;
pe->e8 = peget8;
pe->loadbase = (ULONG)ImageStart;
pe->imagebase = NtHeaders->OptionalHeader.ImageBase;
pe->imagesize = NtHeaders->OptionalHeader.SizeOfImage;
pe->nsections = NtHeaders->FileHeader.NumberOfSections;
pe->sect = SectionHeaders;
pe->nsymbols = NtHeaders->FileHeader.NumberOfSymbols;
pe->symtab = malloc(pe->nsymbols * sizeof(CoffSymbol));
PSYMENT SymbolData = (PSYMENT)
(((PCHAR)ImageStart) +
pefindrva
(pe->sect,
pe->nsections,
NtHeaders->FileHeader.PointerToSymbolTable));
int i, j;
for (i = 0, j = 0; i < pe->nsymbols; i++) {
if ((SymbolData[i].e_scnum < 1) ||
(SymbolData[i].e_sclass != C_EXT &&
SymbolData[i].e_sclass != C_STAT))
continue;
int section = SymbolData[i].e_scnum - 1;
if (SymbolData[i].e.e.e_zeroes) {
pe->symtab[j].name = malloc(sizeof(SymbolData[i].e.e_name)+1);
strcpy(pe->symtab[j].name, SymbolData[i].e.e_name);
} else {
PCHAR SymbolName = ((PCHAR)ImageStart) +
pefindrva
(pe->sect,
pe->nsections,
NtHeaders->FileHeader.PointerToSymbolTable +
(NtHeaders->FileHeader.NumberOfSymbols * 18) +
SymbolData[i].e.e.e_offset);
pe->symtab[j].name = malloc(strlen(SymbolName)+1);
strcpy(pe->symtab[j].name, SymbolName);
}
if (pe->symtab[j].name[0] == '.') {
free(pe->symtab[j].name);
continue;
}
pe->symtab[j].address = pe->sect[section].VirtualAddress + SymbolData[i].e_value;
j++;
}
pe->nsymbols = j;
pe->loadsection = loadmemsection;
*RosSymInfo = dwarfopen(pe);
PIMAGE_DOS_HEADER DosHeader;
PIMAGE_NT_HEADERS NtHeaders;
PIMAGE_SECTION_HEADER SectionHeader;
ULONG SectionIndex;
BOOLEAN RosSymSectionFound = FALSE;
CHAR SectionName[IMAGE_SIZEOF_SHORT_NAME];
return !!*RosSymInfo;
freeall:
if (AnsiNameString.Buffer) RosSymFreeMem(AnsiNameString.Buffer);
for (SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections;
SectionIndex++)
RtlFreeAnsiString(ANSI_NAME_STRING(&SectionHeaders[SectionIndex]));
RosSymFreeMem(SectionHeaders);
return FALSE;
/* Check if MZ header is valid */
DosHeader = (PIMAGE_DOS_HEADER) ImageStart;
if (ImageSize < sizeof(IMAGE_DOS_HEADER)
|| ! ROSSYM_IS_VALID_DOS_HEADER(DosHeader))
{
DPRINT1("Image doesn't have a valid DOS header\n");
return FALSE;
}
/* Locate NT header */
NtHeaders = (PIMAGE_NT_HEADERS)((char *) ImageStart + DosHeader->e_lfanew);
if (ImageSize < DosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)
|| ! ROSSYM_IS_VALID_NT_HEADERS(NtHeaders))
{
DPRINT1("Image doesn't have a valid PE header\n");
return FALSE;
}
/* Search for the section header */
SectionHeader = IMAGE_FIRST_SECTION(NtHeaders);
if (ImageSize < (ULONG_PTR)((char *) (SectionHeader + NtHeaders->FileHeader.NumberOfSections)
- (char *) ImageStart))
{
DPRINT1("Image doesn't have valid section headers\n");
return FALSE;
}
strncpy(SectionName, ROSSYM_SECTION_NAME, IMAGE_SIZEOF_SHORT_NAME);
for (SectionIndex = 0; SectionIndex < NtHeaders->FileHeader.NumberOfSections; SectionIndex++)
{
if (0 == memcmp(SectionName, SectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME))
{
RosSymSectionFound = TRUE;
break;
}
SectionHeader++;
}
if (!RosSymSectionFound)
{
DPRINT("No %s section found\n", ROSSYM_SECTION_NAME);
return FALSE;
}
/* Locate the section itself */
if (ImageSize < SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData
|| SectionHeader->SizeOfRawData < sizeof(ROSSYM_HEADER))
{
DPRINT("Invalid %s section\n", ROSSYM_SECTION_NAME);
return FALSE;
}
if (SectionHeader->VirtualAddress + SectionHeader->Misc.VirtualSize > ImageSize)
{
DPRINT("Bad %s section virtual size!\n", ROSSYM_SECTION_NAME);
return FALSE;
}
/* Load it */
return RosSymCreateFromRaw((char *) ImageStart + SectionHeader->VirtualAddress,
SectionHeader->SizeOfRawData, RosSymInfo);
}
/* EOF */
+2 -2
View File
@@ -38,8 +38,8 @@ RosSymInitKernelMode(VOID)
{
RosSymAllocMemKM,
RosSymFreeMemKM,
RosSymIoReadFile,
RosSymIoSeekFile
RosSymZwReadFile,
RosSymZwSeekFile
};
RosSymInit(&KmCallbacks);
+3 -14
View File
@@ -7,13 +7,9 @@
* PROGRAMMERS: Ge van Geldorp (gvg@reactos.com)
*/
#define WIN32_NO_STATUS
#include <windows.h>
#include <reactos/rossym.h>
#include "rossympriv.h"
#define NTOS_MODE_USER
#include <ndk/ntndk.h>
#include <pseh/pseh.h>
#define NDEBUG
#include <debug.h>
@@ -21,19 +17,13 @@
static PVOID
RosSymAllocMemUM(ULONG_PTR Size)
{
return RtlAllocateHeap(RtlGetProcessHeap(), 0, Size);
return HeapAlloc(GetProcessHeap(), 0, Size);
}
static VOID
RosSymFreeMemUM(PVOID Area)
{
RtlFreeHeap(RtlGetProcessHeap(), 0, Area);
}
static BOOLEAN
RosSymGetMemUM(ULONG_PTR *Target, PVOID SourceMem, ULONG Size)
{
return FALSE;
HeapFree(GetProcessHeap(), 0, Area);
}
VOID
@@ -44,8 +34,7 @@ RosSymInitUserMode(VOID)
RosSymAllocMemUM,
RosSymFreeMemUM,
RosSymZwReadFile,
RosSymZwSeekFile,
RosSymGetMemUM
RosSymZwSeekFile
};
RosSymInit(&KmCallbacks);
+4
View File
@@ -111,6 +111,10 @@ void pefree(Pe *pe) {
for (i = 0; i < pe->nsections; i++) {
RtlFreeAnsiString(ANSI_NAME_STRING(&pe->sect[i]));
}
for (i = 0; i < pe->nsymbols; i++) {
free(pe->symtab[i].name);
}
free(pe->symtab);
free(pe->sect);
free(pe);
}
+30
View File
@@ -6,19 +6,49 @@
struct DwarfBlock;
typedef struct _IMAGE_SECTION_HEADER PeSect;
typedef struct _CoffSymbol {
ulong address;
char *name;
} CoffSymbol;
typedef struct _Pe {
void *fd;
u16int (*e2)(const unsigned char *data);
u32int (*e4)(const unsigned char *data);
u64int (*e8)(const unsigned char *data);
ulong imagebase, imagesize, loadbase;
ulong nsymbols;
CoffSymbol *symtab;
int (*loadsection)(struct _Pe *pe, char *name, struct DwarfBlock *b);
int nsections;
struct _IMAGE_SECTION_HEADER *sect;
} Pe;
#define E_SYMNMLEN 8
#include <pshpack1.h>
typedef struct {
union {
char e_name[E_SYMNMLEN];
struct {
unsigned long e_zeroes;
unsigned long e_offset;
} e;
} e;
unsigned long e_value;
short e_scnum;
unsigned short e_type;
unsigned char e_sclass;
unsigned char e_numaux;
} SYMENT, *PSYMENT;
#include <poppack.h>
#define C_EXT 2
#define C_STAT 3
#define DT_FCN 0x40
Pe *peopen(const char *name);
int loaddisksection(struct _Pe *pe, char *name, struct DwarfBlock *b);
int loadmemsection(struct _Pe *pe, char *name, struct DwarfBlock *b);
u16int peget2(const unsigned char *ptr);
u32int peget4(const unsigned char *ptr);
u64int peget8(const unsigned char *ptr);
+6 -2
View File
@@ -9,7 +9,12 @@
#pragma once
#define HIGHBIT 0x80000000
typedef struct _ROSSYM_INFO {
PROSSYM_ENTRY Symbols;
ULONG SymbolsCount;
PCHAR Strings;
ULONG StringsLength;
} ROSSYM_INFO;
extern ROSSYM_CALLBACKS RosSymCallbacks;
@@ -17,7 +22,6 @@ extern ROSSYM_CALLBACKS RosSymCallbacks;
#define RosSymFreeMem(Area) (*RosSymCallbacks.FreeMemProc)(Area)
#define RosSymReadFile(FileContext, Buffer, Size) (*RosSymCallbacks.ReadFileProc)((FileContext), (Buffer), (Size))
#define RosSymSeekFile(FileContext, Position) (*RosSymCallbacks.SeekFileProc)((FileContext), (Position))
#define RosSymGetMem(TargetAddress, Address, Size) (*RosSymCallbacks.MemGetProc)((TargetAddress), (Address), (Size))
extern BOOLEAN RosSymZwReadFile(PVOID FileContext, PVOID Buffer, ULONG Size);
extern BOOLEAN RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position);
+6 -8
View File
@@ -15,40 +15,38 @@
#define NDEBUG
#include <debug.h>
NTSTATUS RosSymStatus;
BOOLEAN
RosSymZwReadFile(PVOID FileContext, PVOID Buffer, ULONG Size)
{
//NTSTATUS Status;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
RosSymStatus = ZwReadFile(*((HANDLE *) FileContext),
Status = ZwReadFile(*((HANDLE *) FileContext),
0, 0, 0,
&IoStatusBlock,
Buffer,
Size,
0, 0);
return NT_SUCCESS(RosSymStatus) && IoStatusBlock.Information == Size;
return NT_SUCCESS(Status) && IoStatusBlock.Information == Size;
}
BOOLEAN
RosSymZwSeekFile(PVOID FileContext, ULONG_PTR Position)
{
//NTSTATUS Status;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
FILE_POSITION_INFORMATION NewPosition;
NewPosition.CurrentByteOffset.u.HighPart = 0;
NewPosition.CurrentByteOffset.u.LowPart = Position;
RosSymStatus = ZwSetInformationFile(*((HANDLE *) FileContext),
Status = ZwSetInformationFile(*((HANDLE *) FileContext),
&IoStatusBlock,
(PVOID) &NewPosition,
sizeof(FILE_POSITION_INFORMATION),
FilePositionInformation);
return NT_SUCCESS(RosSymStatus);
return NT_SUCCESS(Status);
}
/* EOF */
+1 -6
View File
@@ -9,14 +9,9 @@ long atol(const char *str)
return (long)_atoi64(str);
}
long _wtol(const wchar_t *str)
{
return (long)_wtoi64(str);
}
int _atoldbl(_LDOUBLE *value, char *str)
{
/* FIXME needs error checking for huge/small values */
//*value = strtold(str,0);
return -1;
}
}
+2
View File
@@ -5,6 +5,7 @@ ClassGUID = {00000000-0000-0000-0000-000000000000}
[DeviceInfsToInstall]
battery.inf
cdrom.inf
disk.inf
display.inf
fdc.inf
hdc.inf
@@ -14,6 +15,7 @@ msmouse.inf
NET_NIC.inf
ports.inf
scsi.inf
unknown.inf
usbport.inf
audio.inf
ks.inf
+8 -4
View File
@@ -1777,11 +1777,15 @@ QSI_DEF(SystemInvalidInfoClass4)
/* Class 50 - System range start address */
QSI_DEF(SystemRangeStartInformation)
{
/* FIXME */
DPRINT1("NtQuerySystemInformation - SystemRangeStartInformation not implemented\n");
return STATUS_NOT_IMPLEMENTED;
}
/* Check user buffer's size */
if (Size != sizeof(ULONG_PTR)) return STATUS_INFO_LENGTH_MISMATCH;
*(PULONG_PTR)Buffer = (ULONG_PTR)MmSystemRangeStart;
if (ReqSize) *ReqSize = sizeof(ULONG_PTR);
return STATUS_SUCCESS;
}
/* Class 51 - Driver verifier information */
QSI_DEF(SystemVerifierInformation)
+49 -226
View File
@@ -13,7 +13,6 @@
#include <ntoskrnl.h>
#define NDEBUG
#include "../cache/section/newmm.h"
#include <debug.h>
/* GLOBALS ******************************************************************/
@@ -27,61 +26,13 @@ typedef struct _IMAGE_SYMBOL_INFO_CACHE
}
IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
typedef struct _ROSSYM_KM_OWN_CONTEXT {
LARGE_INTEGER FileOffset;
PFILE_OBJECT FileObject;
} ROSSYM_KM_OWN_CONTEXT, *PROSSYM_KM_OWN_CONTEXT;
static BOOLEAN LoadSymbols;
static LIST_ENTRY SymbolFileListHead;
static KSPIN_LOCK SymbolFileListLock;
static PROSSYM_INFO KdbpRosSymInfo;
static ULONG_PTR KdbpImageBase;
BOOLEAN KdbpSymbolsInitialized = FALSE;
/* FUNCTIONS ****************************************************************/
static BOOLEAN
KdbpSeekSymFile(PVOID FileContext, ULONG_PTR Target)
{
PROSSYM_KM_OWN_CONTEXT Context = (PROSSYM_KM_OWN_CONTEXT)FileContext;
Context->FileOffset.QuadPart = Target;
return TRUE;
}
static BOOLEAN
KdbpReadSymFile(PVOID FileContext, PVOID Buffer, ULONG Length)
{
PROSSYM_KM_OWN_CONTEXT Context = (PROSSYM_KM_OWN_CONTEXT)FileContext;
IO_STATUS_BLOCK Iosb;
NTSTATUS Status = MiSimpleRead
(Context->FileObject,
&Context->FileOffset,
Buffer,
Length,
FALSE,
&Iosb);
return NT_SUCCESS(Status);
}
static PROSSYM_KM_OWN_CONTEXT
KdbpCaptureFileForSymbols(PFILE_OBJECT FileObject)
{
PROSSYM_KM_OWN_CONTEXT Context = ExAllocatePool(NonPagedPool, sizeof(*Context));
if (!Context) return NULL;
ObReferenceObject(FileObject);
Context->FileOffset.QuadPart = 0;
Context->FileObject = FileObject;
return Context;
}
static VOID
KdbpReleaseFileForSymbols(PROSSYM_KM_OWN_CONTEXT Context)
{
ObDereferenceObject(Context->FileObject);
ExFreePool(Context);
}
static BOOLEAN
KdbpSymSearchModuleList(
IN PLIST_ENTRY current_entry,
@@ -174,142 +125,31 @@ KdbSymPrintAddress(
IN PVOID Address,
IN PKTRAP_FRAME Context)
{
int i;
PMEMORY_AREA MemoryArea = NULL;
PROS_SECTION_OBJECT SectionObject;
PLDR_DATA_TABLE_ENTRY LdrEntry;
PROSSYM_KM_OWN_CONTEXT FileContext;
ULONG_PTR RelativeAddress;
NTSTATUS Status;
ROSSYM_LINEINFO LineInfo = { };
struct {
enum _ROSSYM_REGNAME regname;
size_t ctx_offset;
} regmap[] = {
{ ROSSYM_X86_EDX, FIELD_OFFSET(KTRAP_FRAME, Edx) },
{ ROSSYM_X86_EAX, FIELD_OFFSET(KTRAP_FRAME, Eax) },
{ ROSSYM_X86_ECX, FIELD_OFFSET(KTRAP_FRAME, Ecx) },
{ ROSSYM_X86_EBX, FIELD_OFFSET(KTRAP_FRAME, Ebx) },
{ ROSSYM_X86_ESI, FIELD_OFFSET(KTRAP_FRAME, Esi) },
{ ROSSYM_X86_EDI, FIELD_OFFSET(KTRAP_FRAME, Edi) },
{ ROSSYM_X86_EBP, FIELD_OFFSET(KTRAP_FRAME, Ebp) },
{ ROSSYM_X86_ESP, FIELD_OFFSET(KTRAP_FRAME, HardwareEsp) }
};
if (Context)
{
DPRINT("Has Context %x (EBP %x)\n", Context, Context->Ebp);
LineInfo.Flags = ROSSYM_LINEINFO_HAS_REGISTERS;
for (i = 0; i < sizeof(regmap) / sizeof(regmap[0]); i++) {
memcpy
(&LineInfo.Registers.Registers[regmap[i].regname],
((PCHAR)Context)+regmap[i].ctx_offset,
sizeof(ULONG_PTR));
DPRINT("DWARF REG[%d] -> %x\n", regmap[i].regname, LineInfo.Registers.Registers[regmap[i].regname]);
}
}
ULONG LineNumber;
CHAR FileName[256];
CHAR FunctionName[256];
if (!KdbpSymbolsInitialized || !KdbpSymFindModule(Address, NULL, -1, &LdrEntry))
return FALSE;
RelativeAddress = (ULONG_PTR)Address - (ULONG_PTR)LdrEntry->DllBase;
Status = KdbSymGetAddressInformation
(LdrEntry->PatchInformation,
RelativeAddress,
&LineInfo);
Status = KdbSymGetAddressInformation(LdrEntry->PatchInformation,
RelativeAddress,
&LineNumber,
FileName,
FunctionName);
if (NT_SUCCESS(Status))
{
DbgPrint("<%wZ:%x (%s:%d (%s))>",
&LdrEntry->BaseDllName, RelativeAddress, LineInfo.FileName, LineInfo.LineNumber, LineInfo.FunctionName);
if (Context)
{
int i;
char *comma = "";
DbgPrint("(");
for (i = 0; i < LineInfo.NumParams; i++) {
DbgPrint
("%s%s=%llx",
comma,
LineInfo.Parameters[i].ValueName,
LineInfo.Parameters[i].Value);
comma = ",";
}
DbgPrint(")");
}
return TRUE;
&LdrEntry->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName);
}
else
{
DbgPrint("<%wZ:%x>", &LdrEntry->BaseDllName, RelativeAddress);
}
else if (Address < MmSystemRangeStart)
{
MemoryArea = MmLocateMemoryAreaByAddress(&PsGetCurrentProcess()->Vm, Address);
if (!MemoryArea || MemoryArea->Type != MEMORY_AREA_SECTION_VIEW)
{
goto end;
}
SectionObject = MemoryArea->Data.SectionData.Section;
if (!(SectionObject->AllocationAttributes & SEC_IMAGE)) goto end;
if (MemoryArea->StartingAddress != (PVOID)KdbpImageBase)
{
if (KdbpRosSymInfo)
{
RosSymDelete(KdbpRosSymInfo);
KdbpRosSymInfo = NULL;
KdbpImageBase = 0;
}
if ((FileContext = KdbpCaptureFileForSymbols(SectionObject->FileObject)))
{
if (RosSymCreateFromFile(FileContext, &KdbpRosSymInfo))
KdbpImageBase = (ULONG_PTR)MemoryArea->StartingAddress;
KdbpReleaseFileForSymbols(FileContext);
}
}
if (KdbpRosSymInfo)
{
RelativeAddress = (ULONG_PTR)Address - KdbpImageBase;
RosSymFreeInfo(&LineInfo);
Status = KdbSymGetAddressInformation
(KdbpRosSymInfo,
RelativeAddress,
&LineInfo);
if (NT_SUCCESS(Status))
{
DbgPrint
("<%wZ:%x (%s:%d (%s))>",
&SectionObject->FileObject->FileName,
RelativeAddress,
LineInfo.FileName,
LineInfo.LineNumber,
LineInfo.FunctionName);
if (Context)
{
int i;
char *comma = "";
DbgPrint("(");
for (i = 0; i < LineInfo.NumParams; i++) {
DbgPrint
("%s%s=%llx",
comma,
LineInfo.Parameters[i].ValueName,
LineInfo.Parameters[i].Value);
comma = ",";
}
DbgPrint(")");
}
return TRUE;
}
}
}
end:
DbgPrint("<%wZ:%x>", &LdrEntry->BaseDllName, RelativeAddress);
return TRUE;
}
@@ -335,11 +175,13 @@ NTSTATUS
KdbSymGetAddressInformation(
IN PROSSYM_INFO RosSymInfo,
IN ULONG_PTR RelativeAddress,
IN PROSSYM_LINEINFO LineInfo)
OUT PULONG LineNumber OPTIONAL,
OUT PCH FileName OPTIONAL,
OUT PCH FunctionName OPTIONAL)
{
if (!KdbpSymbolsInitialized ||
!RosSymInfo ||
!RosSymGetAddressInformation(RosSymInfo, RelativeAddress, LineInfo))
!RosSymGetAddressInformation(RosSymInfo, RelativeAddress, LineNumber, FileName, FunctionName))
{
return STATUS_UNSUCCESSFUL;
}
@@ -367,6 +209,8 @@ KdbpSymFindCachedFile(
PLIST_ENTRY CurrentEntry;
KIRQL Irql;
DPRINT("Looking for cached symbol file %wZ\n", FileName);
KeAcquireSpinLock(&SymbolFileListLock, &Irql);
CurrentEntry = SymbolFileListHead.Flink;
@@ -374,6 +218,7 @@ KdbpSymFindCachedFile(
{
Current = CONTAINING_RECORD(CurrentEntry, IMAGE_SYMBOL_INFO_CACHE, ListEntry);
DPRINT("Current->FileName %wZ FileName %wZ\n", &Current->FileName, FileName);
if (RtlEqualUnicodeString(&Current->FileName, FileName, TRUE))
{
Current->RefCount++;
@@ -470,6 +315,7 @@ KdbpSymRemoveCachedFile(
}
KeReleaseSpinLock(&SymbolFileListLock, Irql);
DPRINT1("Warning: Removing unknown symbol file: RosSymInfo = %p\n", RosSymInfo);
}
/*! \brief Loads a symbol file.
@@ -488,8 +334,6 @@ KdbpSymLoadModuleSymbols(
HANDLE FileHandle;
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
PFILE_OBJECT FileObject;
PROSSYM_KM_OWN_CONTEXT FileContext;
/* Allow KDB to break on module load */
KdbModuleLoaded(FileName);
@@ -511,7 +355,7 @@ KdbpSymLoadModuleSymbols(
/* Open the file */
InitializeObjectAttributes(&ObjectAttributes,
FileName,
OBJ_CASE_INSENSITIVE,
0,
NULL,
NULL);
@@ -531,34 +375,20 @@ KdbpSymLoadModuleSymbols(
DPRINT("Loading symbols from %wZ...\n", FileName);
Status = ObReferenceObjectByHandle
(FileHandle,
FILE_READ_DATA|SYNCHRONIZE,
NULL,
KernelMode,
(PVOID*)&FileObject,
NULL);
if (!NT_SUCCESS(Status))
if (!RosSymCreateFromFile(&FileHandle, RosSymInfo))
{
DPRINT("Could not get the file object\n");
ZwClose(FileHandle);
DPRINT("Failed to load symbols from %wZ\n", FileName);
return;
}
if ((FileContext = KdbpCaptureFileForSymbols(FileObject)))
{
if (RosSymCreateFromFile(FileContext, RosSymInfo))
{
/* add file to cache */
KdbpSymAddCachedFile(FileName, *RosSymInfo);
DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo);
}
KdbpReleaseFileForSymbols(FileContext);
}
ObDereferenceObject(FileObject);
ZwClose(FileHandle);
DPRINT("Symbols loaded.\n");
/* add file to cache */
KdbpSymAddCachedFile(FileName, *RosSymInfo);
DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo);
}
VOID
@@ -575,16 +405,29 @@ KdbSymProcessSymbols(
if (LdrEntry->PatchInformation)
KdbpSymRemoveCachedFile(LdrEntry->PatchInformation);
/* Error loading symbol info, try to load it from file */
KdbpSymLoadModuleSymbols(&LdrEntry->FullDllName,
/* Load new symbol information */
if (! RosSymCreateFromMem(LdrEntry->DllBase,
LdrEntry->SizeOfImage,
(PROSSYM_INFO*)&LdrEntry->PatchInformation))
{
/* Error loading symbol info, try to load it from file */
KdbpSymLoadModuleSymbols(&LdrEntry->FullDllName,
(PROSSYM_INFO*)&LdrEntry->PatchInformation);
/* It already added symbols to cache */
/* It already added symbols to cache */
}
else
{
/* Add file to cache */
KdbpSymAddCachedFile(&LdrEntry->FullDllName, LdrEntry->PatchInformation);
}
DPRINT("Installed symbols: %wZ@%p-%p %p\n",
&LdrEntry->BaseDllName,
LdrEntry->DllBase,
(PVOID)(LdrEntry->SizeOfImage + (ULONG_PTR)LdrEntry->DllBase),
LdrEntry->PatchInformation);
}
VOID
@@ -596,26 +439,6 @@ KdbDebugPrint(
/* Nothing here */
}
static PVOID KdbpSymAllocMem(ULONG_PTR size)
{
return ExAllocatePoolWithTag(NonPagedPool, size, 'RSYM');
}
static VOID KdbpSymFreeMem(PVOID Area)
{
return ExFreePool(Area);
}
static BOOLEAN KdbpSymReadMem(PVOID FileContext, PVOID TargetDebug, PVOID SourceMem, ULONG Size)
{
return NT_SUCCESS(KdbpSafeReadMemory(TargetDebug, SourceMem, Size));
}
static ROSSYM_CALLBACKS KdbpRosSymCallbacks = {
KdbpSymAllocMem, KdbpSymFreeMem,
KdbpReadSymFile, KdbpSeekSymFile,
KdbpSymReadMem
};
/*! \brief Initializes the KDB symbols implementation.
*
@@ -701,9 +524,9 @@ KdbInitialize(
p1 = p2;
}
RosSymInit(&KdbpRosSymCallbacks);
RosSymInitKernelMode();
}
else if (BootPhase == 3)
else if (BootPhase == 1)
{
/* Load symbols for NTOSKRNL.EXE.
It is always the first module in PsLoadedModuleList. KeLoaderBlock can't be used here as its content is just temporary. */
+4 -3
View File
@@ -393,10 +393,11 @@ MiFindEmptyAddressRangeDownTree(IN SIZE_T Length,
/* Calculate the initial upper margin */
HighVpn = BoundaryAddress >> PAGE_SHIFT;
/* Starting from the root, go down until the right-most child,
trying to stay below the boundary. */
/* Starting from the root, go down until the right-most child
* which is just behind the boundary*/
LowestNode = Node = RtlRightChildAvl(&Table->BalancedRoot);
while ((Child = RtlRightChildAvl(Node))) Node = Child;
while (((Child = RtlRightChildAvl(Node)) != 0 )
&& (Node->EndingVpn < HighVpn )) Node = Child;
/* Now loop the Vad nodes */
while (Node)
+1 -1
View File
@@ -305,7 +305,7 @@
@ extern HalDispatchTable _HalDispatchTable
@ fastcall HalExamineMBR(ptr long long ptr)
@ extern HalPrivateDispatchTable
;HeadlessDispatch
@ stdcall HeadlessDispatch(long ptr long ptr ptr)
@ stdcall InbvAcquireDisplayOwnership()
@ stdcall InbvCheckDisplayOwnership()
@ stdcall InbvDisplayString(str)
+1 -1
View File
@@ -105,7 +105,7 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
PROCESS_ALL_ACCESS,
&ObjectAttributes,
&ClientId);
DPRINT1("CSR PRocess: %p Handle: %p\n", pProcessData, pProcessData->Process);
DPRINT1("CSR Process: %p Handle: %p\n", pProcessData, pProcessData->Process);
if (!NT_SUCCESS(Status))
{
ProcessData[hash] = pProcessData->next;
-3
View File
@@ -12,8 +12,6 @@
#include <srv.h>
#define NDEBUG
#define NDEBUG
#include <debug.h>
@@ -181,7 +179,6 @@ CsrSrvCreateSharedSection(IN PCHAR ParameterValue)
if (!NT_SUCCESS(Status)) return Status;
/* Multiply by 1024 entries and round to page size */
#define ROUND_UP(n,size) (((ULONG)(n) + (size - 1)) & ~(size - 1)) // hax
CsrSrvSharedSectionSize = ROUND_UP(Size * 1024, CsrNtSysInfo.PageSize);
DPRINT1("Size: %lx\n", CsrSrvSharedSectionSize);
+6 -3
View File
@@ -514,9 +514,12 @@ CsrpCreateHeap (int argc, char ** argv, char ** envp)
Status = CsrSrvCreateSharedSection(Value);
DPRINT1("Status: %lx\n", Status);
ASSERT(Status == STATUS_SUCCESS);
if (Status != STATUS_SUCCESS)
{
DPRINT1("CsrSrvCreateSharedSection failed with status 0x%08lx\n", Status);
ASSERT(FALSE);
}
BasepFakeStaticServerData();
return STATUS_SUCCESS;
}
+4
View File
@@ -18,3 +18,7 @@
/* Internal CSRSS Headers */
#include <api.h>
#include <csrplugin.h>
/* Defines */
#define ROUND_UP(n, align) ROUND_DOWN(((ULONG)n) + (align) - 1, (align))
#define ROUND_DOWN(n, align) (((ULONG)n) & ~((align) - 1l))
+1 -1
View File
@@ -286,7 +286,7 @@ CSR_API(CsrAllocConsole)
FALSE,
0))
{
DPRINT1("DuplicateHandle() failed: %d\n", GetLastError);
DPRINT1("DuplicateHandle() failed: %lu\n", GetLastError());
ConioDeleteConsole((Object_t *) Console);
if (NewConsole || !ProcessData->bInheritHandles)
{
+20 -26
View File
@@ -1,26 +1,20 @@
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR i686)
# which compilers to use for C and C++
set(CMAKE_C_COMPILER cl)
set(CMAKE_CXX_COMPILER cl)
set(CMAKE_RC_COMPILER rc)
if(${ARCH} MATCHES amd64)
set(CMAKE_ASM_COMPILER ml64)
else()
set(CMAKE_ASM_COMPILER ml)
endif()
set(CMAKE_RC_COMPILE_OBJECT "<CMAKE_RC_COMPILER> <DEFINES> /I${REACTOS_SOURCE_DIR}/include/psdk /I${REACTOS_BINARY_DIR}/include/psdk /I${REACTOS_SOURCE_DIR}/include /I${REACTOS_SOURCE_DIR}/include/reactos /I${REACTOS_BINARY_DIR}/include/reactos /I${REACTOS_SOURCE_DIR}/include/reactos/wine /I${REACTOS_SOURCE_DIR}/include/crt /I${REACTOS_SOURCE_DIR}/include/crt/mingw32 /fo <OBJECT> <SOURCE>")
set(CMAKE_ASM_COMPILE_OBJECT
"<CMAKE_C_COMPILER> /nologo /X /I${REACTOS_SOURCE_DIR}/include/asm /I${REACTOS_BINARY_DIR}/include/asm <FLAGS> <DEFINES> /D__ASM__ /D_USE_ML /EP /c <SOURCE> > <OBJECT>.tmp"
"<CMAKE_ASM_COMPILER> /nologo /Cp /Fo<OBJECT> /c /Ta <OBJECT>.tmp")
set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "")
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
add_definitions(-D__i386__)
endif()
# the name of the target operating system
set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_SYSTEM_PROCESSOR i686)
# which compilers to use for C and C++
set(CMAKE_C_COMPILER cl)
set(CMAKE_CXX_COMPILER cl)
set(CMAKE_RC_COMPILER rc)
if(${ARCH} MATCHES amd64)
set(CMAKE_ASM_COMPILER ml64)
else()
set(CMAKE_ASM_COMPILER ml)
endif()
set(CMAKE_C_STANDARD_LIBRARIES "" CACHE INTERNAL "")
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86")
add_definitions(-D__i386__)
endif()
+985
View File
@@ -0,0 +1,985 @@
/*
* Usage: rsym input-file output-file
*
* There are two sources of information: the .stab/.stabstr
* sections of the executable and the COFF symbol table. Most
* of the information is in the .stab/.stabstr sections.
* However, most of our asm files don't contain .stab directives,
* so routines implemented in assembler won't show up in the
* .stab section. They are present in the COFF symbol table.
* So, we mostly use the .stab/.stabstr sections, but we augment
* the info there with info from the COFF symbol table when
* possible.
*
* This is a tool and is compiled using the host compiler,
* i.e. on Linux gcc and not mingw-gcc (cross-compiler).
* Therefore we can't include SDK headers and we have to
* duplicate some definitions here.
* Also note that the internal functions are "old C-style",
* returning an int, where a return of 0 means success and
* non-zero is failure.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include "rsym.h"
static int
CompareSymEntry(const PROSSYM_ENTRY SymEntry1, const PROSSYM_ENTRY SymEntry2)
{
if (SymEntry1->Address < SymEntry2->Address)
{
return -1;
}
if (SymEntry2->Address < SymEntry1->Address)
{
return +1;
}
return 0;
}
static int
GetStabInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader,
PIMAGE_SECTION_HEADER PESectionHeaders,
ULONG *StabSymbolsLength, void **StabSymbolsBase,
ULONG *StabStringsLength, void **StabStringsBase)
{
ULONG Idx;
/* Load .stab and .stabstr sections if available */
*StabSymbolsBase = NULL;
*StabSymbolsLength = 0;
*StabStringsBase = NULL;
*StabStringsLength = 0;
for (Idx = 0; Idx < PEFileHeader->NumberOfSections; Idx++)
{
/* printf("section: '%.08s'\n", PESectionHeaders[Idx].Name); */
if ((strncmp((char*)PESectionHeaders[Idx].Name, ".stab", 5) == 0)
&& (PESectionHeaders[Idx].Name[5] == 0))
{
/* printf(".stab section found. Size %d\n",
PESectionHeaders[Idx].SizeOfRawData); */
*StabSymbolsLength = PESectionHeaders[Idx].SizeOfRawData;
*StabSymbolsBase = (void *)((char *) FileData + PESectionHeaders[Idx].PointerToRawData);
}
if (strncmp((char*)PESectionHeaders[Idx].Name, ".stabstr", 8) == 0)
{
/* printf(".stabstr section found. Size %d\n",
PESectionHeaders[Idx].SizeOfRawData); */
*StabStringsLength = PESectionHeaders[Idx].SizeOfRawData;
*StabStringsBase = (void *)((char *) FileData + PESectionHeaders[Idx].PointerToRawData);
}
}
return 0;
}
static int
GetCoffInfo(void *FileData, PIMAGE_FILE_HEADER PEFileHeader,
PIMAGE_SECTION_HEADER PESectionHeaders,
ULONG *CoffSymbolsLength, void **CoffSymbolsBase,
ULONG *CoffStringsLength, void **CoffStringsBase)
{
if (0 == PEFileHeader->PointerToSymbolTable || 0 == PEFileHeader->NumberOfSymbols)
{
/* No COFF symbol table */
*CoffSymbolsLength = 0;
*CoffStringsLength = 0;
}
else
{
*CoffSymbolsLength = PEFileHeader->NumberOfSymbols * sizeof(COFF_SYMENT);
*CoffSymbolsBase = (void *)((char *) FileData + PEFileHeader->PointerToSymbolTable);
*CoffStringsLength = *((ULONG *) ((char *) *CoffSymbolsBase + *CoffSymbolsLength));
*CoffStringsBase = (void *)((char *) *CoffSymbolsBase + *CoffSymbolsLength);
}
return 0;
}
static ULONG
FindOrAddString(char *StringToFind, ULONG *StringsLength, void *StringsBase)
{
char *Search, *End;
Search = (char *) StringsBase;
End = Search + *StringsLength;
while (Search < End)
{
if (0 == strcmp(Search, StringToFind))
{
return Search - (char *) StringsBase;
}
Search += strlen(Search) + 1;
}
strcpy(Search, StringToFind);
*StringsLength += strlen(StringToFind) + 1;
return Search - (char *) StringsBase;
}
static int
ConvertStabs(ULONG *SymbolsCount, PROSSYM_ENTRY *SymbolsBase,
ULONG *StringsLength, void *StringsBase,
ULONG StabSymbolsLength, void *StabSymbolsBase,
ULONG StabStringsLength, void *StabStringsBase,
ULONG_PTR ImageBase, PIMAGE_FILE_HEADER PEFileHeader,
PIMAGE_SECTION_HEADER PESectionHeaders)
{
PSTAB_ENTRY StabEntry;
ULONG Count, i;
ULONG_PTR Address, LastFunctionAddress;
int First = 1;
char *Name;
ULONG NameLen;
char FuncName[256];
PROSSYM_ENTRY Current;
StabEntry = StabSymbolsBase;
Count = StabSymbolsLength / sizeof(STAB_ENTRY);
*SymbolsCount = 0;
if (Count == 0)
{
/* No symbol info */
*SymbolsBase = NULL;
return 0;
}
*SymbolsBase = malloc(Count * sizeof(ROSSYM_ENTRY));
if (NULL == *SymbolsBase)
{
fprintf(stderr, "Failed to allocate memory for converted .stab symbols\n");
return 1;
}
Current = *SymbolsBase;
memset ( Current, 0, sizeof(*Current) );
LastFunctionAddress = 0;
for (i = 0; i < Count; i++)
{
if ( 0 == LastFunctionAddress )
{
Address = StabEntry[i].n_value - ImageBase;
}
else
{
Address = LastFunctionAddress + StabEntry[i].n_value;
}
switch (StabEntry[i].n_type)
{
case N_SO:
case N_SOL:
case N_BINCL:
Name = (char *) StabStringsBase + StabEntry[i].n_strx;
if (StabStringsLength < StabEntry[i].n_strx
||'\0' == *Name || '/' == Name[strlen(Name) - 1]
|| '\\' == Name[strlen(Name) - 1]
|| StabEntry[i].n_value < ImageBase)
{
continue;
}
if ( First || Address != Current->Address )
{
if ( !First )
{
memset ( ++Current, 0, sizeof(*Current) );
Current->FunctionOffset = Current[-1].FunctionOffset;
}
else
First = 0;
Current->Address = Address;
}
Current->FileOffset = FindOrAddString((char *)StabStringsBase
+ StabEntry[i].n_strx,
StringsLength,
StringsBase);
break;
case N_FUN:
if (0 == StabEntry[i].n_desc || StabEntry[i].n_value < ImageBase)
{
LastFunctionAddress = 0; /* line # 0 = end of function */
continue;
}
if ( First || Address != Current->Address )
{
if ( !First )
memset ( ++Current, 0, sizeof(*Current) );
else
First = 0;
Current->Address = Address;
Current->FileOffset = Current[-1].FileOffset;
}
Name = (char *) StabStringsBase + StabEntry[i].n_strx;
NameLen = strcspn(Name, ":");
if (sizeof(FuncName) <= NameLen)
{
free(*SymbolsBase);
fprintf(stderr, "Function name too long\n");
return 1;
}
memcpy(FuncName, Name, NameLen);
FuncName[NameLen] = '\0';
Current->FunctionOffset = FindOrAddString(FuncName,
StringsLength,
StringsBase);
Current->SourceLine = 0;
LastFunctionAddress = Address;
break;
case N_SLINE:
if ( First || Address != Current->Address )
{
if ( !First )
{
memset ( ++Current, 0, sizeof(*Current) );
Current->FileOffset = Current[-1].FileOffset;
Current->FunctionOffset = Current[-1].FunctionOffset;
}
else
First = 0;
Current->Address = Address;
}
Current->SourceLine = StabEntry[i].n_desc;
break;
default:
continue;
}
}
*SymbolsCount = (Current - *SymbolsBase + 1);
qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry);
return 0;
}
static int
ConvertCoffs(ULONG *SymbolsCount, PROSSYM_ENTRY *SymbolsBase,
ULONG *StringsLength, void *StringsBase,
ULONG CoffSymbolsLength, void *CoffSymbolsBase,
ULONG CoffStringsLength, void *CoffStringsBase,
ULONG_PTR ImageBase, PIMAGE_FILE_HEADER PEFileHeader,
PIMAGE_SECTION_HEADER PESectionHeaders)
{
ULONG Count, i;
PCOFF_SYMENT CoffEntry;
char FuncName[256];
char *p;
PROSSYM_ENTRY Current;
CoffEntry = (PCOFF_SYMENT) CoffSymbolsBase;
Count = CoffSymbolsLength / sizeof(COFF_SYMENT);
*SymbolsBase = malloc(Count * sizeof(ROSSYM_ENTRY));
if (NULL == *SymbolsBase)
{
fprintf(stderr, "Unable to allocate memory for converted COFF symbols\n");
return 1;
}
*SymbolsCount = 0;
Current = *SymbolsBase;
for (i = 0; i < Count; i++)
{
if (ISFCN(CoffEntry[i].e_type) || C_EXT == CoffEntry[i].e_sclass)
{
Current->Address = CoffEntry[i].e_value;
if (0 < CoffEntry[i].e_scnum)
{
if (PEFileHeader->NumberOfSections < CoffEntry[i].e_scnum)
{
free(*SymbolsBase);
fprintf(stderr, "Invalid section number %d in COFF symbols (only %d sections present)\n",
CoffEntry[i].e_scnum, PEFileHeader->NumberOfSections);
return 1;
}
Current->Address += PESectionHeaders[CoffEntry[i].e_scnum - 1].VirtualAddress;
}
Current->FileOffset = 0;
if (0 == CoffEntry[i].e.e.e_zeroes)
{
if (sizeof(FuncName) <= strlen((char *) CoffStringsBase + CoffEntry[i].e.e.e_offset))
{
free(*SymbolsBase);
fprintf(stderr, "Function name too long\n");
return 1;
}
strcpy(FuncName, (char *) CoffStringsBase + CoffEntry[i].e.e.e_offset);
}
else
{
memcpy(FuncName, CoffEntry[i].e.e_name, E_SYMNMLEN);
FuncName[E_SYMNMLEN] = '\0';
}
/* Name demangling: stdcall */
p = strrchr(FuncName, '@');
if (NULL != p)
{
*p = '\0';
}
p = ('_' == FuncName[0] || '@' == FuncName[0] ? FuncName + 1 : FuncName);
Current->FunctionOffset = FindOrAddString(p,
StringsLength,
StringsBase);
Current->SourceLine = 0;
memset ( ++Current, 0, sizeof(*Current) );
}
i += CoffEntry[i].e_numaux;
}
*SymbolsCount = (Current - *SymbolsBase + 1);
qsort(*SymbolsBase, *SymbolsCount, sizeof(ROSSYM_ENTRY), (int (*)(const void *, const void *)) CompareSymEntry);
return 0;
}
static int
MergeStabsAndCoffs(ULONG *MergedSymbolCount, PROSSYM_ENTRY *MergedSymbols,
ULONG StabSymbolsCount, PROSSYM_ENTRY StabSymbols,
ULONG CoffSymbolsCount, PROSSYM_ENTRY CoffSymbols)
{
ULONG StabIndex, j;
ULONG CoffIndex;
ULONG_PTR StabFunctionStartAddress;
ULONG StabFunctionStringOffset, NewStabFunctionStringOffset;
*MergedSymbolCount = 0;
if (StabSymbolsCount == 0)
{
*MergedSymbols = NULL;
return 0;
}
*MergedSymbols = malloc(StabSymbolsCount * sizeof(ROSSYM_ENTRY));
if (NULL == *MergedSymbols)
{
fprintf(stderr, "Unable to allocate memory for merged symbols\n");
return 1;
}
StabFunctionStartAddress = 0;
StabFunctionStringOffset = 0;
CoffIndex = 0;
for (StabIndex = 0; StabIndex < StabSymbolsCount; StabIndex++)
{
(*MergedSymbols)[*MergedSymbolCount] = StabSymbols[StabIndex];
for (j = StabIndex + 1;
j < StabSymbolsCount && StabSymbols[j].Address == StabSymbols[StabIndex].Address;
j++)
{
if (0 != StabSymbols[j].FileOffset && 0 == (*MergedSymbols)[*MergedSymbolCount].FileOffset)
{
(*MergedSymbols)[*MergedSymbolCount].FileOffset = StabSymbols[j].FileOffset;
}
if (0 != StabSymbols[j].FunctionOffset && 0 == (*MergedSymbols)[*MergedSymbolCount].FunctionOffset)
{
(*MergedSymbols)[*MergedSymbolCount].FunctionOffset = StabSymbols[j].FunctionOffset;
}
if (0 != StabSymbols[j].SourceLine && 0 == (*MergedSymbols)[*MergedSymbolCount].SourceLine)
{
(*MergedSymbols)[*MergedSymbolCount].SourceLine = StabSymbols[j].SourceLine;
}
}
StabIndex = j - 1;
while (CoffIndex < CoffSymbolsCount
&& CoffSymbols[CoffIndex + 1].Address <= (*MergedSymbols)[*MergedSymbolCount].Address)
{
CoffIndex++;
}
NewStabFunctionStringOffset = (*MergedSymbols)[*MergedSymbolCount].FunctionOffset;
if (CoffSymbolsCount > 0 &&
CoffSymbols[CoffIndex].Address < (*MergedSymbols)[*MergedSymbolCount].Address
&& StabFunctionStartAddress < CoffSymbols[CoffIndex].Address
&& 0 != CoffSymbols[CoffIndex].FunctionOffset)
{
(*MergedSymbols)[*MergedSymbolCount].FunctionOffset = CoffSymbols[CoffIndex].FunctionOffset;
}
if (StabFunctionStringOffset != NewStabFunctionStringOffset)
{
StabFunctionStartAddress = (*MergedSymbols)[*MergedSymbolCount].Address;
}
StabFunctionStringOffset = NewStabFunctionStringOffset;
(*MergedSymbolCount)++;
}
return 0;
}
static PIMAGE_SECTION_HEADER
FindSectionForRVA(DWORD RVA, unsigned NumberOfSections, PIMAGE_SECTION_HEADER SectionHeaders)
{
unsigned Section;
for (Section = 0; Section < NumberOfSections; Section++)
{
if (SectionHeaders[Section].VirtualAddress <= RVA &&
RVA < SectionHeaders[Section].VirtualAddress + SectionHeaders[Section].Misc.VirtualSize)
{
return SectionHeaders + Section;
}
}
return NULL;
}
static int
IncludeRelocationsForSection(PIMAGE_SECTION_HEADER SectionHeader)
{
static char *BlacklistedSections[] =
{
".edata",
".idata",
".reloc"
};
char SectionName[IMAGE_SIZEOF_SHORT_NAME];
unsigned i;
if (0 != (SectionHeader->Characteristics & IMAGE_SCN_LNK_REMOVE))
{
return 0;
}
for (i = 0; i < sizeof(BlacklistedSections) / sizeof(BlacklistedSections[0]); i++)
{
strncpy(SectionName, BlacklistedSections[i], IMAGE_SIZEOF_SHORT_NAME);
if (0 == memcmp(SectionName, SectionHeader->Name, IMAGE_SIZEOF_SHORT_NAME))
{
return 0;
}
}
return 1;
}
static int
ProcessRelocations(ULONG *ProcessedRelocsLength, void **ProcessedRelocs,
void *RawData, PIMAGE_OPTIONAL_HEADER OptHeader,
unsigned NumberOfSections, PIMAGE_SECTION_HEADER SectionHeaders)
{
PIMAGE_SECTION_HEADER RelocSectionHeader, TargetSectionHeader;
PIMAGE_BASE_RELOCATION BaseReloc, End, AcceptedRelocs;
int Found;
if (OptHeader->NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_BASERELOC
|| 0 == OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)
{
/* No relocation entries */
*ProcessedRelocsLength = 0;
*ProcessedRelocs = NULL;
return 0;
}
RelocSectionHeader = FindSectionForRVA(OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,
NumberOfSections, SectionHeaders);
if (NULL == RelocSectionHeader)
{
fprintf(stderr, "Can't find section header for relocation data\n");
return 1;
}
*ProcessedRelocs = malloc(RelocSectionHeader->SizeOfRawData);
if (NULL == *ProcessedRelocs)
{
fprintf(stderr, "Failed to allocate %u bytes for relocations\n", (unsigned int)RelocSectionHeader->SizeOfRawData);
return 1;
}
*ProcessedRelocsLength = 0;
BaseReloc = (PIMAGE_BASE_RELOCATION) ((char *) RawData
+ RelocSectionHeader->PointerToRawData
+ (OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress -
RelocSectionHeader->VirtualAddress));
End = (PIMAGE_BASE_RELOCATION) ((char *) BaseReloc
+ OptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size);
while (BaseReloc < End && 0 < BaseReloc->SizeOfBlock)
{
TargetSectionHeader = FindSectionForRVA(BaseReloc->VirtualAddress, NumberOfSections,
SectionHeaders);
if (NULL != TargetSectionHeader && IncludeRelocationsForSection(TargetSectionHeader))
{
AcceptedRelocs = *ProcessedRelocs;
Found = 0;
while (AcceptedRelocs < (PIMAGE_BASE_RELOCATION) ((char *) *ProcessedRelocs +
*ProcessedRelocsLength)
&& ! Found)
{
Found = BaseReloc->SizeOfBlock == AcceptedRelocs->SizeOfBlock
&& 0 == memcmp(BaseReloc, AcceptedRelocs, AcceptedRelocs->SizeOfBlock);
AcceptedRelocs= (PIMAGE_BASE_RELOCATION) ((char *) AcceptedRelocs +
AcceptedRelocs->SizeOfBlock);
}
if (! Found)
{
memcpy((char *) *ProcessedRelocs + *ProcessedRelocsLength,
BaseReloc, BaseReloc->SizeOfBlock);
*ProcessedRelocsLength += BaseReloc->SizeOfBlock;
}
}
BaseReloc = (PIMAGE_BASE_RELOCATION)((char *) BaseReloc + BaseReloc->SizeOfBlock);
}
return 0;
}
static int
CreateOutputFile(FILE *OutFile, void *InData,
PIMAGE_DOS_HEADER InDosHeader, PIMAGE_FILE_HEADER InFileHeader,
PIMAGE_OPTIONAL_HEADER InOptHeader, PIMAGE_SECTION_HEADER InSectionHeaders,
ULONG RosSymLength, void *RosSymSection)
{
ULONG StartOfRawData;
unsigned Section;
void *OutHeader, *ProcessedRelocs, *PaddedRosSym, *Data;
PIMAGE_DOS_HEADER OutDosHeader;
PIMAGE_FILE_HEADER OutFileHeader;
PIMAGE_OPTIONAL_HEADER OutOptHeader;
PIMAGE_SECTION_HEADER OutSectionHeaders, CurrentSectionHeader;
DWORD CheckSum;
ULONG Length, i;
ULONG ProcessedRelocsLength;
ULONG RosSymOffset, RosSymFileLength;
int InRelocSectionIndex;
PIMAGE_SECTION_HEADER OutRelocSection;
StartOfRawData = 0;
for (Section = 0; Section < InFileHeader->NumberOfSections; Section++)
{
if ((0 == StartOfRawData
|| InSectionHeaders[Section].PointerToRawData < StartOfRawData)
&& 0 != InSectionHeaders[Section].PointerToRawData
&& 0 == (InSectionHeaders[Section].Characteristics & IMAGE_SCN_LNK_REMOVE))
{
StartOfRawData = InSectionHeaders[Section].PointerToRawData;
}
}
OutHeader = malloc(StartOfRawData);
if (NULL == OutHeader)
{
fprintf(stderr, "Failed to allocate %u bytes for output file header\n", (unsigned int)StartOfRawData);
return 1;
}
memset(OutHeader, '\0', StartOfRawData);
OutDosHeader = (PIMAGE_DOS_HEADER) OutHeader;
memcpy(OutDosHeader, InDosHeader, InDosHeader->e_lfanew + sizeof(ULONG));
OutFileHeader = (PIMAGE_FILE_HEADER)((char *) OutHeader + OutDosHeader->e_lfanew + sizeof(ULONG));
memcpy(OutFileHeader, InFileHeader, sizeof(IMAGE_FILE_HEADER));
OutFileHeader->PointerToSymbolTable = 0;
OutFileHeader->NumberOfSymbols = 0;
OutFileHeader->Characteristics &= ~(IMAGE_FILE_LINE_NUMS_STRIPPED | IMAGE_FILE_LOCAL_SYMS_STRIPPED |
IMAGE_FILE_DEBUG_STRIPPED);
OutOptHeader = (PIMAGE_OPTIONAL_HEADER)(OutFileHeader + 1);
memcpy(OutOptHeader, InOptHeader, sizeof(IMAGE_OPTIONAL_HEADER));
OutOptHeader->CheckSum = 0;
OutSectionHeaders = (PIMAGE_SECTION_HEADER)((char *) OutOptHeader + OutFileHeader->SizeOfOptionalHeader);
if (ProcessRelocations(&ProcessedRelocsLength, &ProcessedRelocs, InData, InOptHeader,
InFileHeader->NumberOfSections, InSectionHeaders))
{
return 1;
}
if (InOptHeader->NumberOfRvaAndSizes < IMAGE_DIRECTORY_ENTRY_BASERELOC
|| 0 == InOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress)
{
InRelocSectionIndex = -1;
}
else
{
InRelocSectionIndex = FindSectionForRVA(InOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress,
InFileHeader->NumberOfSections, InSectionHeaders) - InSectionHeaders;
}
OutFileHeader->NumberOfSections = 0;
CurrentSectionHeader = OutSectionHeaders;
OutOptHeader->SizeOfImage = 0;
RosSymOffset = 0;
OutRelocSection = NULL;
for (Section = 0; Section < InFileHeader->NumberOfSections; Section++)
{
if (0 == (InSectionHeaders[Section].Characteristics & IMAGE_SCN_LNK_REMOVE))
{
*CurrentSectionHeader = InSectionHeaders[Section];
CurrentSectionHeader->PointerToLinenumbers = 0;
CurrentSectionHeader->NumberOfLinenumbers = 0;
if (OutOptHeader->SizeOfImage < CurrentSectionHeader->VirtualAddress +
CurrentSectionHeader->Misc.VirtualSize)
{
OutOptHeader->SizeOfImage = ROUND_UP(CurrentSectionHeader->VirtualAddress +
CurrentSectionHeader->Misc.VirtualSize,
OutOptHeader->SectionAlignment);
}
if (RosSymOffset < CurrentSectionHeader->PointerToRawData + CurrentSectionHeader->SizeOfRawData)
{
RosSymOffset = CurrentSectionHeader->PointerToRawData + CurrentSectionHeader->SizeOfRawData;
}
if (Section == (ULONG)InRelocSectionIndex)
{
OutRelocSection = CurrentSectionHeader;
}
(OutFileHeader->NumberOfSections) ++;
CurrentSectionHeader++;
}
}
if (OutRelocSection == CurrentSectionHeader - 1)
{
OutOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = ProcessedRelocsLength;
if (OutOptHeader->SizeOfImage == OutRelocSection->VirtualAddress +
ROUND_UP(OutRelocSection->Misc.VirtualSize,
OutOptHeader->SectionAlignment))
{
OutOptHeader->SizeOfImage = OutRelocSection->VirtualAddress +
ROUND_UP(ProcessedRelocsLength,
OutOptHeader->SectionAlignment);
}
OutRelocSection->Misc.VirtualSize = ProcessedRelocsLength;
if (RosSymOffset == OutRelocSection->PointerToRawData
+ OutRelocSection->SizeOfRawData)
{
RosSymOffset = OutRelocSection->PointerToRawData +
ROUND_UP(ProcessedRelocsLength, OutOptHeader->FileAlignment);
}
OutRelocSection->SizeOfRawData = ROUND_UP(ProcessedRelocsLength,
OutOptHeader->FileAlignment);
}
if (RosSymLength > 0)
{
RosSymFileLength = ROUND_UP(RosSymLength, OutOptHeader->FileAlignment);
memcpy(CurrentSectionHeader->Name, ".rossym", 8); /* We're lucky: string is exactly 8 bytes long */
CurrentSectionHeader->Misc.VirtualSize = RosSymLength;
CurrentSectionHeader->VirtualAddress = OutOptHeader->SizeOfImage;
CurrentSectionHeader->SizeOfRawData = RosSymFileLength;
CurrentSectionHeader->PointerToRawData = RosSymOffset;
CurrentSectionHeader->PointerToRelocations = 0;
CurrentSectionHeader->PointerToLinenumbers = 0;
CurrentSectionHeader->NumberOfRelocations = 0;
CurrentSectionHeader->NumberOfLinenumbers = 0;
CurrentSectionHeader->Characteristics = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
| IMAGE_SCN_LNK_REMOVE | IMAGE_SCN_TYPE_NOLOAD;
OutOptHeader->SizeOfImage = ROUND_UP(CurrentSectionHeader->VirtualAddress +
CurrentSectionHeader->Misc.VirtualSize,
OutOptHeader->SectionAlignment);
(OutFileHeader->NumberOfSections)++;
PaddedRosSym = malloc(RosSymFileLength);
if (NULL == PaddedRosSym)
{
fprintf(stderr, "Failed to allocate %u bytes for padded .rossym\n", (unsigned int)RosSymFileLength);
return 1;
}
memcpy(PaddedRosSym, RosSymSection, RosSymLength);
memset((char *) PaddedRosSym + RosSymLength, '\0', RosSymFileLength - RosSymLength);
}
else
{
PaddedRosSym = NULL;
}
CheckSum = 0;
for (i = 0; i < StartOfRawData / 2; i++)
{
CheckSum += ((unsigned short*) OutHeader)[i];
CheckSum = 0xffff & (CheckSum + (CheckSum >> 16));
}
Length = StartOfRawData;
for (Section = 0; Section < OutFileHeader->NumberOfSections; Section++)
{
DWORD SizeOfRawData;
if (OutRelocSection == OutSectionHeaders + Section)
{
Data = (void *) ProcessedRelocs;
SizeOfRawData = ProcessedRelocsLength;
}
else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
{
Data = (void *) PaddedRosSym;
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
else
{
Data = (void *) ((char *) InData + OutSectionHeaders[Section].PointerToRawData);
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
for (i = 0; i < SizeOfRawData / 2; i++)
{
CheckSum += ((unsigned short*) Data)[i];
CheckSum = 0xffff & (CheckSum + (CheckSum >> 16));
}
Length += OutSectionHeaders[Section].SizeOfRawData;
}
CheckSum += Length;
OutOptHeader->CheckSum = CheckSum;
if (fwrite(OutHeader, 1, StartOfRawData, OutFile) != StartOfRawData)
{
perror("Error writing output header\n");
free(OutHeader);
return 1;
}
for (Section = 0; Section < OutFileHeader->NumberOfSections; Section++)
{
if (0 != OutSectionHeaders[Section].SizeOfRawData)
{
DWORD SizeOfRawData;
fseek(OutFile, OutSectionHeaders[Section].PointerToRawData, SEEK_SET);
if (OutRelocSection == OutSectionHeaders + Section)
{
Data = (void *) ProcessedRelocs;
SizeOfRawData = ProcessedRelocsLength;
}
else if (RosSymLength > 0 && Section + 1 == OutFileHeader->NumberOfSections)
{
Data = (void *) PaddedRosSym;
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
else
{
Data = (void *) ((char *) InData + OutSectionHeaders[Section].PointerToRawData);
SizeOfRawData = OutSectionHeaders[Section].SizeOfRawData;
}
if (fwrite(Data, 1, SizeOfRawData, OutFile) != SizeOfRawData)
{
perror("Error writing section data\n");
free(PaddedRosSym);
free(OutHeader);
return 1;
}
}
}
if (PaddedRosSym)
{
free(PaddedRosSym);
}
free(OutHeader);
return 0;
}
int main(int argc, char* argv[])
{
PSYMBOLFILE_HEADER SymbolFileHeader;
PIMAGE_DOS_HEADER PEDosHeader;
PIMAGE_FILE_HEADER PEFileHeader;
PIMAGE_OPTIONAL_HEADER PEOptHeader;
PIMAGE_SECTION_HEADER PESectionHeaders;
ULONG ImageBase;
void *StabBase;
ULONG StabsLength;
void *StabStringBase;
ULONG StabStringsLength;
void *CoffBase = NULL;
ULONG CoffsLength;
void *CoffStringBase = NULL;
ULONG CoffStringsLength;
char* path1;
char* path2;
FILE* out;
void *StringBase;
ULONG StringsLength;
ULONG StabSymbolsCount;
PROSSYM_ENTRY StabSymbols;
ULONG CoffSymbolsCount;
PROSSYM_ENTRY CoffSymbols;
ULONG MergedSymbolsCount;
PROSSYM_ENTRY MergedSymbols;
size_t FileSize;
void *FileData;
ULONG RosSymLength;
void *RosSymSection;
char elfhdr[4] = { '\177', 'E', 'L', 'F' };
if (3 != argc)
{
fprintf(stderr, "Usage: rsym <exefile> <symfile>\n");
exit(1);
}
path1 = convert_path(argv[1]);
path2 = convert_path(argv[2]);
FileData = load_file ( path1, &FileSize );
if ( !FileData )
{
fprintf ( stderr, "An error occured loading '%s'\n", path1 );
exit(1);
}
/* Check if MZ header exists */
PEDosHeader = (PIMAGE_DOS_HEADER) FileData;
if (PEDosHeader->e_magic != IMAGE_DOS_MAGIC || PEDosHeader->e_lfanew == 0L)
{
/* Ignore elf */
if (!memcmp(PEDosHeader, elfhdr, sizeof(elfhdr)))
exit(0);
perror("Input file is not a PE image.\n");
free(FileData);
exit(1);
}
/* Locate PE file header */
/* sizeof(ULONG) = sizeof(MAGIC) */
PEFileHeader = (PIMAGE_FILE_HEADER)((char *) FileData + PEDosHeader->e_lfanew + sizeof(ULONG));
/* Locate optional header */
assert(sizeof(ULONG) == 4);
PEOptHeader = (PIMAGE_OPTIONAL_HEADER)(PEFileHeader + 1);
ImageBase = PEOptHeader->ImageBase;
/* Locate PE section headers */
PESectionHeaders = (PIMAGE_SECTION_HEADER)((char *) PEOptHeader + PEFileHeader->SizeOfOptionalHeader);
if (GetStabInfo(FileData, PEFileHeader, PESectionHeaders, &StabsLength, &StabBase,
&StabStringsLength, &StabStringBase))
{
free(FileData);
exit(1);
}
if (GetCoffInfo(FileData, PEFileHeader, PESectionHeaders, &CoffsLength, &CoffBase,
&CoffStringsLength, &CoffStringBase))
{
free(FileData);
exit(1);
}
StringBase = malloc(1 + StabStringsLength + CoffStringsLength +
(CoffsLength / sizeof(ROSSYM_ENTRY)) * (E_SYMNMLEN + 1));
if (NULL == StringBase)
{
free(FileData);
fprintf(stderr, "Failed to allocate memory for strings table\n");
exit(1);
}
/* Make offset 0 into an empty string */
*((char *) StringBase) = '\0';
StringsLength = 1;
if (ConvertStabs(&StabSymbolsCount, &StabSymbols, &StringsLength, StringBase,
StabsLength, StabBase, StabStringsLength, StabStringBase,
ImageBase, PEFileHeader, PESectionHeaders))
{
free(StringBase);
free(FileData);
fprintf(stderr, "Failed to allocate memory for strings table\n");
exit(1);
}
if (ConvertCoffs(&CoffSymbolsCount, &CoffSymbols, &StringsLength, StringBase,
CoffsLength, CoffBase, CoffStringsLength, CoffStringBase,
ImageBase, PEFileHeader, PESectionHeaders))
{
if (StabSymbols)
{
free(StabSymbols);
}
free(StringBase);
free(FileData);
exit(1);
}
if (MergeStabsAndCoffs(&MergedSymbolsCount, &MergedSymbols,
StabSymbolsCount, StabSymbols,
CoffSymbolsCount, CoffSymbols))
{
if (CoffSymbols)
{
free(CoffSymbols);
}
if (StabSymbols)
{
free(StabSymbols);
}
free(StringBase);
free(FileData);
exit(1);
}
if (CoffSymbols)
{
free(CoffSymbols);
}
if (StabSymbols)
{
free(StabSymbols);
}
if (MergedSymbolsCount == 0)
{
RosSymLength = 0;
RosSymSection = NULL;
}
else
{
RosSymLength = sizeof(SYMBOLFILE_HEADER) + MergedSymbolsCount * sizeof(ROSSYM_ENTRY)
+ StringsLength;
RosSymSection = malloc(RosSymLength);
if (NULL == RosSymSection)
{
free(MergedSymbols);
free(StringBase);
free(FileData);
fprintf(stderr, "Unable to allocate memory for .rossym section\n");
exit(1);
}
memset(RosSymSection, '\0', RosSymLength);
SymbolFileHeader = (PSYMBOLFILE_HEADER) RosSymSection;
SymbolFileHeader->SymbolsOffset = sizeof(SYMBOLFILE_HEADER);
SymbolFileHeader->SymbolsLength = MergedSymbolsCount * sizeof(ROSSYM_ENTRY);
SymbolFileHeader->StringsOffset = SymbolFileHeader->SymbolsOffset + SymbolFileHeader->SymbolsLength;
SymbolFileHeader->StringsLength = StringsLength;
memcpy((char *) RosSymSection + SymbolFileHeader->SymbolsOffset, MergedSymbols,
SymbolFileHeader->SymbolsLength);
memcpy((char *) RosSymSection + SymbolFileHeader->StringsOffset, StringBase,
SymbolFileHeader->StringsLength);
free(MergedSymbols);
}
free(StringBase);
out = fopen(path2, "wb");
if (out == NULL)
{
perror("Cannot open output file");
free(RosSymSection);
free(FileData);
exit(1);
}
if (CreateOutputFile(out, FileData, PEDosHeader, PEFileHeader, PEOptHeader,
PESectionHeaders, RosSymLength, RosSymSection))
{
fclose(out);
if (RosSymSection)
{
free(RosSymSection);
}
free(FileData);
exit(1);
}
fclose(out);
if (RosSymSection)
{
free(RosSymSection);
}
free(FileData);
return 0;
}
/* EOF */