OSDN Git Service

(LibGoblin)
[drdeamon64/drdeamon64.git] / libgoblin / drd64_libgoblin_api.c
1 /*DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64
2
3                          D r . D e a m o n  6 4
4                         for INTEL64(R), AMD64(R)
5         
6    Copyright(C) 2007-2009 Koine Yuusuke(koinec). All rights reserved.
7
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are met:
10
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.
16
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.
28
29 DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64DrDeAmOn64*/
30
31 /* File Info -----------------------------------------------------------
32 File: drd64_.c
33 Function: 
34 Comment: 
35 ----------------------------------------------------------------------*/
36
37 #define DRD64_SRC_LIBGOBLIN_API
38 #include"drd64_libgoblin.h"
39
40
41 #define LOCATION(n) DRD64_ERR_LOCATION( \
42                                                 DRD64_ERROR_MODULE_LIBGOBLIN, DRD64_ERROR_ARCH_NODEPEND, \
43                                                 DRD64_SRCID_LIBGOBLIN_API, (n))
44
45 /***********************************************************************
46 ***********************************************************************/
47 #define FUNCID_LibGoblin_AnalyzeMainProgram     0x31
48 LIBGOBLIN_API
49 int
50         LibGoblin_AnalyzeMainProgram(
51                 int             i_pgid )
52 {
53         int             i_result;
54         LibGoblin_ProgramInfo   *p_pginfo;
55         LibGoblin_BinaryInfo    *p_binfo;
56
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__ );
63                 return -0x01;
64         }
65
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__ );
72                 return -0x02;
73         }
74
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__ );
81                 return -0x03;
82         }
83
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__ );
90                 return -0x04;
91         }
92
93         i_result        = ObjectInfo_PostProc( p_pginfo, p_binfo );
94         if( 0x00 != i_result )  {
95                 LibBrownie_Error_SetErrorInfo(
96                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x05 ),
97                                 LOCATION( FUNCID_LibGoblin_AnalyzeMainProgram ),
98                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
99                 return -0x05;
100         }
101
102         //Debug_Index_DWARFInfo_DumpObjectInfo( p_binfo, 0xff );
103
104         // XXX: for DEBUG!
105         Debug_ObjectInfo_Print_AllGroupLink( p_pginfo, 0xff );
106
107         return  i_result;
108 }
109
110
111 /***********************************************************************
112 ***********************************************************************/
113 #define FUNCID_LibGoblin_AnalyzeLibrary 0x32
114 LIBGOBLIN_API
115 int
116         LibGoblin_AnalyzeLibrary(
117                 int             i_pgid,
118                 int             i_bid,
119                 PtrValue        ptr_loadaddr )
120 {
121         int             i_result;
122         LibGoblin_BinaryInfo    *p_binfo;
123
124         p_binfo = BinaryInfo_GetBinInfo( i_bid );
125         if( NULL == p_binfo )   {
126                 LibBrownie_Error_SetErrorInfo(
127                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
128                                 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
129                                 errno, (QWord)i_bid, (QWord)0x00, __LINE__ );
130                 return -0x01;
131         }
132
133         if( p_binfo->i_pginfo != i_pgid )       {
134                 LibBrownie_Error_SetErrorInfo(
135                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x02 ),
136                                 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
137                                 errno, (QWord)p_binfo->i_pginfo, (QWord)i_pgid, __LINE__ );
138                 return -0x02;
139         }
140
141         i_result        = ELF_ReadELF_Phase2( p_binfo, ptr_loadaddr );
142         if( 0x00 != i_result )  {
143                 LibBrownie_Error_SetErrorInfo(
144                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
145                                 LOCATION( FUNCID_LibGoblin_AnalyzeLibrary ),
146                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
147                 return -0x03;
148         }
149
150         return  i_result;
151 }
152
153
154 /***********************************************************************
155 ***********************************************************************/
156 #define FUNCID_LibGoblin_GetUnresolv_ObjectFilePath     0x22
157 LIBGOBLIN_API
158 int
159         LibGoblin_GetUnresolv_ObjectFilePath(
160                 int             i_pgid,
161                 LibGoblin_ObjectFilePath *p_objpath )
162 {
163         int             i_result;
164         LibGoblin_ProgramInfo   *p_pginfo;
165         LibGoblin_BinaryInfo    *p_binfo;
166         LibGoblin_BinaryInfo    *p_binfo_parent;
167         LibGoblin_BinaryFile    *p_bfile;
168
169         if( NULL == p_objpath ) {
170                 LibBrownie_Error_SetErrorInfo(
171                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x02 ),
172                                 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
173                                 errno, (QWord)0x00, (QWord)0x00, __LINE__ );
174                 return -0x02;
175         }
176
177         p_pginfo        = ProgInfo_GetProgInfo( i_pgid );
178         if( NULL == p_pginfo )  {
179                 LibBrownie_Error_SetErrorInfo(
180                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x03 ),
181                                 LOCATION( FUNCID_LibGoblin_GetUnresolv_ObjectFilePath ),
182                                 errno, (QWord)i_pgid, (QWord)0x00, __LINE__ );
183                 return -0x03;
184         }
185
186         p_binfo = BinaryInfo_GetBinInfo( p_pginfo->i_binfo_id );
187         while( NULL != p_binfo )        {
188                 if( LIBGOBLIN_BINFO_PHASE_SETPROG > p_binfo->b_phase )
189                         { break; }
190                 p_binfo = BinaryInfo_GetBinInfo( p_binfo->i_binfo_next );
191         }
192
193         i_result        = -0x01;
194         if( NULL != p_binfo )   {
195                 memset( p_objpath, 0x00, sizeof( LibGoblin_ObjectFilePath ) );
196
197                 p_objpath->i_bid        = p_binfo->i_id;
198
199                 strncpy( p_objpath->str_filename, p_binfo->str_filename, DRD64_MAX_PATH );
200
201                 if( -1 < p_binfo->i_binfo_parent )      {
202                         p_binfo_parent  = BinaryInfo_GetBinInfo( p_binfo->i_binfo_parent );
203                         p_bfile = BinaryFile_GetBinaryFile( p_binfo_parent->i_binfile );
204                         if( NULL != p_bfile )   {
205                                 strncpy( p_objpath->str_rpath, p_bfile->str_rpath, DRD64_MAX_PATH );
206                                 strncpy( p_objpath->str_runpath, p_bfile->str_runpath, DRD64_MAX_PATH );
207                         }
208                 }
209
210                 i_result        = p_binfo->i_id;
211         }
212
213         return i_result;
214 }
215
216
217 /***********************************************************************
218 ***********************************************************************/
219 #define FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath  0x23
220 LIBGOBLIN_API
221 int
222         LibGoblin_SetPathAndLoad_ObjectFilePath(
223                 LibGoblin_ObjectFilePath        *p_objpath )
224 {
225         int             i_result;
226         LibGoblin_BinaryInfo    *p_binfo;
227
228         p_binfo = BinaryInfo_GetBinInfo( p_objpath->i_bid );
229         if( NULL == p_binfo )   {
230                 LibBrownie_Error_SetErrorInfo(
231                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
232                                 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
233                                 errno, (QWord)p_objpath->i_bid, (QWord)0x00, __LINE__ );
234                 return -0x01;
235         }
236
237         i_result        = strncmp( p_objpath->str_filename,
238                                                 p_binfo->str_filename, DRD64_MAX_PATH );
239         if( 0x00 != i_result )  {
240                 LibBrownie_Error_SetErrorInfo(
241                                 DRD64_ERROR( DRD64_ERROR_PTN_LIBCALL, 0x01, 0x01 ),
242                                 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
243                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
244                 return -0x02;
245         }
246         
247         i_result        = BinaryInfo_SetProgramPath(
248                                                 p_binfo, p_objpath->str_remotepath,
249                                                 p_objpath->str_localpath );
250         if( 0x00 != i_result )  {
251                 LibBrownie_Error_SetErrorInfo(
252                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
253                                 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
254                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
255                 return -0x03;
256         }
257
258         i_result        = LoadProg_LoadBinaryInfo( p_binfo );
259         if( 0x00 != i_result )  {
260                 LibBrownie_Error_SetErrorInfo(
261                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
262                                 LOCATION( FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath ),
263                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
264                 return -0x04;
265         }
266
267         return 0x00;
268 }
269
270
271
272 /***********************************************************************
273 ***********************************************************************/
274 #define FUNCID_LibGoblin_LoadProgram_Main       0x21
275 LIBGOBLIN_API
276 int
277         LibGoblin_LoadProgram_Main(
278                 int             i_pgid,
279                 const char      *pstr_remotefull,
280                 const char      *pstr_localfull )
281 {
282         int             i_bid;
283         LibGoblin_ProgramInfo   *p_pginfo;
284
285     p_pginfo    = ProgInfo_GetProgInfo( i_pgid );
286         if( NULL == p_pginfo )  {
287                 LibBrownie_Error_SetErrorInfo(
288                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
289                                 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
290                                 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
291                 return -0x01;
292         }
293
294         if( NULL == pstr_localfull )    {
295                 LibBrownie_Error_SetErrorInfo(
296                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILED_ARG, 0x01, 0x01 ),
297                                 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
298                                 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
299                 return -0x02;
300         }
301
302         i_bid   = LoadProgram_LoadMainProgram(
303                                                 p_pginfo, pstr_remotefull, pstr_localfull );
304         if(( 0 > i_bid ) || ( NULL == pstr_localfull )) {
305                 LibBrownie_Error_SetErrorInfo(
306                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
307                                 LOCATION( FUNCID_LibGoblin_LoadProgram_Main ),
308                                 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
309                 return -0x03;
310         }
311
312         return  i_bid;
313 }
314
315
316 /***********************************************************************
317 ***********************************************************************/
318 #define FUNCID_LibGoblin_AllocProgInfo  0x11
319 LIBGOBLIN_API_PROGINFO
320 int
321         LibGoblin_AllocProgInfo(
322                 void )
323 {
324         int             i_result;
325         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
326  
327         p_pginfo        = ProgInfo_AllocProgInfo();
328         if( NULL == p_pginfo )  {
329                 LibBrownie_Error_SetErrorInfo(
330                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
331                                 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
332                                 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
333                 return -0x01;
334         }
335
336         i_result        = ObjectInfo_Init( p_pginfo, 0 );
337         if( 0x00 != i_result )  {
338                 ProgInfo_FreeProgInfo( p_pginfo );      // None use return value.
339
340                 LibBrownie_Error_SetErrorInfo(
341                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
342                                 LOCATION( FUNCID_LibGoblin_AllocProgInfo ),
343                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
344                 return -0x02;
345         }
346
347         return p_pginfo->i_id;
348 }
349
350
351 /***********************************************************************
352 ***********************************************************************/
353 #define FUNCID_LibGoblin_FreeProgInfo   0x12
354 LIBGOBLIN_API_PROGINFO
355 int
356         LibGoblin_FreeProgInfo(
357                 int i_pgid )
358 {
359         int             i_result;
360         LibGoblin_ProgramInfo   *p_pginfo;
361
362         p_pginfo        = ProgInfo_GetProgInfo( i_pgid );
363         if( NULL == p_pginfo )  {
364                 LibBrownie_Error_SetErrorInfo(
365                                 DRD64_ERROR( DRD64_ERROR_PTN_FAILCALL, 0x01, 0x01 ),
366                                 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
367                                 errno, (QWord)p_pginfo, (QWord)0x00, __LINE__ );
368                 return -0x01;
369         }
370         assert( p_pginfo->i_id == i_pgid );
371
372         ObjectInfo_Term( p_pginfo );    // None use retrun value.
373
374         i_result        = ProgInfo_FreeProgInfo( p_pginfo );
375         if( 0x00 != i_result )  {
376                 LibBrownie_Error_SetErrorInfo(
377                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
378                                 LOCATION( FUNCID_LibGoblin_FreeProgInfo ),
379                                 errno, (QWord)i_result, (QWord)0x00, __LINE__ );
380                 return -0x02;
381         }
382
383         return 0x00;
384 }
385
386 /***********************************************************************
387 ***********************************************************************/
388 #define FUNCID_LibGoblin_Init   0x01
389 LIBGOBLIN_API
390 int
391         LibGoblin_Init(
392                 void )
393 {
394         int             i_err;
395         
396         i_err   = LibBrownie_Init();
397         if( 0x00 != i_err )             { return i_err; }
398
399         i_err   = LibFileType_Init();
400         if( 0x00 != i_err )             {
401                 LibBrownie_Error_SetErrorInfo(
402                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
403                                 LOCATION( FUNCID_LibGoblin_Init ),
404                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
405                 return i_err;
406         }
407
408         i_err   = ProgInfo_Init();
409         if( 0x00 != i_err )             {
410                 LibBrownie_Error_SetErrorInfo(
411                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
412                                 LOCATION( FUNCID_LibGoblin_Init ),
413                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
414                 return i_err;
415         }
416
417         i_err   = BinaryInfo_Init();
418         if( 0x00 != i_err )             {
419                 LibBrownie_Error_SetErrorInfo(
420                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
421                                 LOCATION( FUNCID_LibGoblin_Init ),
422                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
423                 return i_err;
424         }
425
426         return 0x00;
427 }
428
429
430 /***********************************************************************
431 ***********************************************************************/
432 #define FUNCID_LibGoblin_Term   0x02
433 LIBGOBLIN_API
434 int
435         LibGoblin_Term(
436                 void )
437 {
438         int             i_err;
439
440         i_err   = BinaryInfo_Term();
441         if( 0x00 != i_err )             {
442                 LibBrownie_Error_SetErrorInfo(
443                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x01 ),
444                                 LOCATION( FUNCID_LibGoblin_Term ),
445                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
446                 return i_err;
447         }
448
449         i_err   = ProgInfo_Term();
450         if( 0x00 != i_err )             {
451                 LibBrownie_Error_SetErrorInfo(
452                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x02 ),
453                                 LOCATION( FUNCID_LibGoblin_Term ),
454                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
455                 return i_err;
456         }
457
458         i_err   = LibFileType_Term();
459         if( 0x00 != i_err )             {
460                 LibBrownie_Error_SetErrorInfo(
461                                 DRD64_ERROR( DRD64_ERROR_PTN_CALLFUNC, 0x01, 0x03 ),
462                                 LOCATION( FUNCID_LibGoblin_Term ),
463                                 errno, (QWord)i_err, (QWord)0x00, __LINE__ );
464                 return i_err;
465         }
466         
467         LibBrownie_Term();
468
469         return 0x00;
470 }
471
472
473 /* EOF of drd64_.c ----------------------------------- */