1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
4 for INTEL64(R), AMD64(R)
6 Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
11 1. Redistributions of source code must retain the above copyright notice,
12 this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
17 THIS SOFTWARE IS PROVIDED BY Koine Yuusuke(koinec) ``AS IS'' AND ANY
18 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL Koine Yuusuke(koinec) OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
27 OF THE POSSIBILITY OF SUCH DAMAGE.
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
31 /* File Info -----------------------------------------------------------
35 ----------------------------------------------------------------------*/
37 #define DRD64_SRC_LIBGOBLIN_API
38 #include"drd64_libgoblin.h"
41 #define LOCATION(n) DRD64_ERR_LOCATION( \
42 DRD64_ERROR_MODULE_LIBGOBLIN, DRD64_ERROR_ARCH_NODEPEND, \
43 DRD64_SRCID_LIBGOBLIN_API, (n))
45 /***********************************************************************
46 ***********************************************************************/
47 #define FUNCID_LibGoblin_AnalyzeMainProgram 0x31
50 LibGoblin_AnalyzeMainProgram(
54 LibGoblin_ProgramInfo *p_pginfo;
55 LibGoblin_BinaryInfo *p_binfo;
57 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
58 if( NULL == p_pginfo ) {
59 LibBrownie_Error_SetErrorInfo(
60 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
61 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
62 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
66 p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
67 if( NULL == p_binfo ) {
68 LibBrownie_Error_SetErrorInfo(
69 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
70 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
71 errno, (QWord)p_pginfo->i_binfo_id, (QWord)0x00, __LINE__ );
75 i_result = ELF_ReadELF_Phase2( p_binfo, (PtrValue)0x00000000 );
76 if( 0x00 != i_result ) {
77 LibBrownie_Error_SetErrorInfo(
78 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
79 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
80 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
84 i_result = DWARF_ReadDWARF( p_binfo );
85 if( 0x00 != i_result ) {
86 LibBrownie_Error_SetErrorInfo(
87 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x04 ),
88 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
89 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
97 /***********************************************************************
98 ***********************************************************************/
99 #define FUNCID_LibGoblin_AnalyzeLibrary 0x32
102 LibGoblin_AnalyzeLibrary(
105 PtrValue ptr_loadaddr )
108 LibGoblin_BinaryInfo *p_binfo;
110 p_binfo = BinaryInfo_GetBinInfo( i_bid );
111 if( NULL == p_binfo ) {
112 LibBrownie_Error_SetErrorInfo(
113 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
114 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
115 errno, (QWord)i_bid, (QWord)0x00, __LINE__ );
119 if( p_binfo->i_pginfo != i_pgid ) {
120 LibBrownie_Error_SetErrorInfo(
121 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
122 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
123 errno, (QWord)p_binfo->i_pginfo, (QWord)i_pgid, __LINE__ );
127 i_result = ELF_ReadELF_Phase2( p_binfo, ptr_loadaddr );
128 if( 0x00 != i_result ) {
129 LibBrownie_Error_SetErrorInfo(
130 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
131 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
132 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
140 /***********************************************************************
141 ***********************************************************************/
142 #define FUNCID_LibGoblin_GetUnresolv_ObjectFilePath 0x22
145 LibGoblin_GetUnresolv_ObjectFilePath(
147 LibGoblin_ObjectFilePath *p_objpath )
150 LibGoblin_ProgramInfo *p_pginfo;
151 LibGoblin_BinaryInfo *p_binfo;
152 LibGoblin_BinaryInfo *p_binfo_parent;
153 LibGoblin_BinaryFile *p_bfile;
155 if( NULL == p_objpath ) {
156 LibBrownie_Error_SetErrorInfo(
157 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x02 ),
158 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
159 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
163 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
164 if( NULL == p_pginfo ) {
165 LibBrownie_Error_SetErrorInfo(
166 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x03 ),
167 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
168 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
172 p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
173 while( NULL != p_binfo ) {
174 if( LIBGOBLIN_BINFO_PHASE_SETPROG > p_binfo->b_phase )
176 p_binfo = BinaryInfo_GetBinInfo( p_binfo->i_binfo_next );
180 if( NULL != p_binfo ) {
181 memset( p_objpath, 0x00, sizeof( LibGoblin_ObjectFilePath ) );
183 p_objpath->i_bid = p_binfo->i_id;
185 strncpy( p_objpath->str_filename, p_binfo->str_filename, DRD64_MAX_PATH );
187 if( -1 < p_binfo->i_binfo_parent ) {
188 p_binfo_parent = BinaryInfo_GetBinInfo( p_binfo->i_binfo_parent );
189 p_bfile = BinaryFile_GetBinaryFile( p_binfo_parent->i_binfile );
190 if( NULL != p_bfile ) {
191 strncpy( p_objpath->str_rpath, p_bfile->str_rpath, DRD64_MAX_PATH );
192 strncpy( p_objpath->str_runpath, p_bfile->str_runpath, DRD64_MAX_PATH );
196 i_result = p_binfo->i_id;
203 /***********************************************************************
204 ***********************************************************************/
205 #define FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath 0x23
208 LibGoblin_SetPathAndLoad_ObjectFilePath(
209 LibGoblin_ObjectFilePath *p_objpath )
212 LibGoblin_BinaryInfo *p_binfo;
214 p_binfo = BinaryInfo_GetBinInfo( p_objpath->i_bid );
215 if( NULL == p_binfo ) {
216 LibBrownie_Error_SetErrorInfo(
217 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
218 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
219 errno, (QWord)p_objpath->i_bid, (QWord)0x00, __LINE__ );
223 i_result = strncmp( p_objpath->str_filename,
224 p_binfo->str_filename, DRD64_MAX_PATH );
225 if( 0x00 != i_result ) {
226 LibBrownie_Error_SetErrorInfo(
227 DRD64_ERROR( DRD64_ERROR_PTN_LIBCALL, 0x01, 0x01 ),
228 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
229 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
233 i_result = BinaryInfo_SetProgramPath(
234 p_binfo, p_objpath->str_remotepath,
235 p_objpath->str_localpath );
236 if( 0x00 != i_result ) {
237 LibBrownie_Error_SetErrorInfo(
238 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
239 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
240 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
244 i_result = LoadProg_LoadBinaryInfo( p_binfo );
245 if( 0x00 != i_result ) {
246 LibBrownie_Error_SetErrorInfo(
247 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
248 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
249 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
258 /***********************************************************************
259 ***********************************************************************/
260 #define FUNCID_LibGoblin_LoadProgram_Main 0x21
263 LibGoblin_LoadProgram_Main(
265 const char *pstr_remotefull,
266 const char *pstr_localfull )
269 LibGoblin_ProgramInfo *p_pginfo;
271 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
272 if( NULL == p_pginfo ) {
273 LibBrownie_Error_SetErrorInfo(
274 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
275 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
276 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
280 if( NULL == pstr_localfull ) {
281 LibBrownie_Error_SetErrorInfo(
282 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
283 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
284 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
288 i_bid = LoadProgram_LoadMainProgram(
289 p_pginfo, pstr_remotefull, pstr_localfull );
290 if(( 0 > i_bid ) || ( NULL == pstr_localfull )) {
291 LibBrownie_Error_SetErrorInfo(
292 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
293 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
294 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
302 /***********************************************************************
303 ***********************************************************************/
304 #define FUNCID_LibGoblin_AllocProgInfo 0x11
305 LIBGOBLIN_API_PROGINFO
307 LibGoblin_AllocProgInfo(
311 LibGoblin_ProgramInfo *p_pginfo = NULL;
313 p_pginfo = ProgInfo_AllocProgInfo();
314 if( NULL == p_pginfo ) {
315 LibBrownie_Error_SetErrorInfo(
316 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
317 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
318 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
322 i_result = ObjectInfo_Init( p_pginfo, 0 );
323 if( 0x00 != i_result ) {
324 ProgInfo_FreeProgInfo( p_pginfo ); // None use return value.
326 LibBrownie_Error_SetErrorInfo(
327 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
328 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
329 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
333 return p_pginfo->i_id;
337 /***********************************************************************
338 ***********************************************************************/
339 #define FUNCID_LibGoblin_FreeProgInfo 0x12
340 LIBGOBLIN_API_PROGINFO
342 LibGoblin_FreeProgInfo(
346 LibGoblin_ProgramInfo *p_pginfo;
348 p_pginfo = ProgInfo_GetProgInfo( i_pgid );
349 if( NULL == p_pginfo ) {
350 LibBrownie_Error_SetErrorInfo(
351 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
352 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
353 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
356 assert( p_pginfo->i_id == i_pgid );
358 ObjectInfo_Term( p_pginfo ); // None use retrun value.
360 i_result = ProgInfo_FreeProgInfo( p_pginfo );
361 if( 0x00 != i_result ) {
362 LibBrownie_Error_SetErrorInfo(
363 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
364 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
365 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
372 /***********************************************************************
373 ***********************************************************************/
374 #define FUNCID_LibGoblin_Init 0x01
382 i_err = LibBrownie_Init();
383 if( 0x00 != i_err ) { return i_err; }
385 i_err = LibFileType_Init();
386 if( 0x00 != i_err ) {
387 LibBrownie_Error_SetErrorInfo(
388 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
389 LOCATION( FUNCID_LibGoblin_Init ),
390 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
394 i_err = ProgInfo_Init();
395 if( 0x00 != i_err ) {
396 LibBrownie_Error_SetErrorInfo(
397 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
398 LOCATION( FUNCID_LibGoblin_Init ),
399 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
403 i_err = BinaryInfo_Init();
404 if( 0x00 != i_err ) {
405 LibBrownie_Error_SetErrorInfo(
406 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
407 LOCATION( FUNCID_LibGoblin_Init ),
408 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
416 /***********************************************************************
417 ***********************************************************************/
418 #define FUNCID_LibGoblin_Term 0x02
426 i_err = BinaryInfo_Term();
427 if( 0x00 != i_err ) {
428 LibBrownie_Error_SetErrorInfo(
429 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
430 LOCATION( FUNCID_LibGoblin_Term ),
431 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
435 i_err = ProgInfo_Term();
436 if( 0x00 != i_err ) {
437 LibBrownie_Error_SetErrorInfo(
438 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
439 LOCATION( FUNCID_LibGoblin_Term ),
440 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
444 i_err = LibFileType_Term();
445 if( 0x00 != i_err ) {
446 LibBrownie_Error_SetErrorInfo(
447 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
448 LOCATION( FUNCID_LibGoblin_Term ),
449 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
459 /* EOF of drd64_.c ----------------------------------- */