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 -0x03;
91         }
92
93         return  i_result;
94 }
95
96
97 /***********************************************************************
98 ***********************************************************************/
99 #define FUNCID_LibGoblin_AnalyzeLibrary 0x32
100 LIBGOBLIN_API
101 int
102         LibGoblin_AnalyzeLibrary(
103                 int             i_pgid,
104                 int             i_bid,
105                 PtrValue        ptr_loadaddr )
106 {
107         int             i_result;
108         LibGoblin_BinaryInfo    *p_binfo;
109
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__ );
116                 return -0x01;
117         }
118
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__ );
124                 return -0x02;
125         }
126
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__ );
133                 return -0x03;
134         }
135
136         return  i_result;
137 }
138
139
140 /***********************************************************************
141 ***********************************************************************/
142 #define FUNCID_LibGoblin_GetUnresolv_ObjectFilePath     0x22
143 LIBGOBLIN_API
144 int
145         LibGoblin_GetUnresolv_ObjectFilePath(
146                 int             i_pgid,
147                 LibGoblin_ObjectFilePath *p_objpath )
148 {
149         int             i_result;
150         LibGoblin_ProgramInfo   *p_pginfo;
151         LibGoblin_BinaryInfo    *p_binfo;
152         LibGoblin_BinaryInfo    *p_binfo_parent;
153         LibGoblin_BinaryFile    *p_bfile;
154
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__ );
160                 return -0x02;
161         }
162
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__ );
169                 return -0x03;
170         }
171
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 )
175                         { break; }
176                 p_binfo = BinaryInfo_GetBinInfo( p_binfo->i_binfo_next );
177         }
178
179         i_result        = -0x01;
180         if( NULL != p_binfo )   {
181                 memset( p_objpath, 0x00, sizeof( LibGoblin_ObjectFilePath ) );
182
183                 p_objpath->i_bid        = p_binfo->i_id;
184
185                 strncpy( p_objpath->str_filename, p_binfo->str_filename, DRD64_MAX_PATH );
186
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 );
193                         }
194                 }
195
196                 i_result        = p_binfo->i_id;
197         }
198
199         return i_result;
200 }
201
202
203 /***********************************************************************
204 ***********************************************************************/
205 #define FUNCID_LibGoblin_SetPathAndLoad_ObjectFilePath  0x23
206 LIBGOBLIN_API
207 int
208         LibGoblin_SetPathAndLoad_ObjectFilePath(
209                 LibGoblin_ObjectFilePath        *p_objpath )
210 {
211         int             i_result;
212         LibGoblin_BinaryInfo    *p_binfo;
213
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__ );
220                 return -0x01;
221         }
222
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__ );
230                 return -0x02;
231         }
232         
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__ );
241                 return -0x03;
242         }
243
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__ );
250                 return -0x04;
251         }
252
253         return 0x00;
254 }
255
256
257
258 /***********************************************************************
259 ***********************************************************************/
260 #define FUNCID_LibGoblin_LoadProgram_Main       0x21
261 LIBGOBLIN_API
262 int
263         LibGoblin_LoadProgram_Main(
264                 int             i_pgid,
265                 const char      *pstr_remotefull,
266                 const char      *pstr_localfull )
267 {
268         int             i_bid;
269         LibGoblin_ProgramInfo   *p_pginfo;
270
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__ );
277                 return -0x01;
278         }
279
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__ );
285                 return -0x02;
286         }
287
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__ );
295                 return -0x03;
296         }
297
298         return  i_bid;
299 }
300
301
302 /***********************************************************************
303 ***********************************************************************/
304 #define FUNCID_LibGoblin_AllocProgInfo  0x11
305 LIBGOBLIN_API_PROGINFO
306 int
307         LibGoblin_AllocProgInfo(
308                 void )
309 {
310         int             i_result;
311         LibGoblin_ProgramInfo   *p_pginfo       = NULL;
312  
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__ );
319                 return -0x01;
320         }
321
322         i_result        = ObjectInfo_Init( p_pginfo, 0 );
323         if( 0x00 != i_result )  {
324                 ProgInfo_FreeProgInfo( p_pginfo );      // None use return value.
325
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__ );
330                 return -0x02;
331         }
332
333         return p_pginfo->i_id;
334 }
335
336
337 /***********************************************************************
338 ***********************************************************************/
339 #define FUNCID_LibGoblin_FreeProgInfo   0x12
340 LIBGOBLIN_API_PROGINFO
341 int
342         LibGoblin_FreeProgInfo(
343                 int i_pgid )
344 {
345         int             i_result;
346         LibGoblin_ProgramInfo   *p_pginfo;
347
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__ );
354                 return -0x01;
355         }
356         assert( p_pginfo->i_id == i_pgid );
357
358         ObjectInfo_Term( p_pginfo );    // None use retrun value.
359
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__ );
366                 return -0x02;
367         }
368
369         return 0x00;
370 }
371
372 /***********************************************************************
373 ***********************************************************************/
374 #define FUNCID_LibGoblin_Init   0x01
375 LIBGOBLIN_API
376 int
377         LibGoblin_Init(
378                 void )
379 {
380         int             i_err;
381         
382         i_err   = LibBrownie_Init();
383         if( 0x00 != i_err )             { return i_err; }
384
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__ );
391                 return i_err;
392         }
393
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__ );
400                 return i_err;
401         }
402
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__ );
409                 return i_err;
410         }
411
412         return 0x00;
413 }
414
415
416 /***********************************************************************
417 ***********************************************************************/
418 #define FUNCID_LibGoblin_Term   0x02
419 LIBGOBLIN_API
420 int
421         LibGoblin_Term(
422                 void )
423 {
424         int             i_err;
425
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__ );
432                 return i_err;
433         }
434
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__ );
441                 return i_err;
442         }
443
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__ );
450                 return i_err;
451         }
452         
453         LibBrownie_Term();
454
455         return 0x00;
456 }
457
458
459 /* EOF of drd64_.c ----------------------------------- */