Changeset 1430

Show
Ignore:
Timestamp:
10/30/07 17:47:01 (1 year ago)
Author:
common
Message:

libemu

  • first functional api hooks for int
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libemu/trunk/src/functions/int.c

    r1429 r1430  
    2828#include <stdint.h> 
    2929 
     30// for the socket hooks 
     31#include <sys/socket.h> 
     32#include <netinet/in.h> 
     33#include <arpa/inet.h> 
     34#include <sys/types.h> 
     35#include <sys/socket.h> 
     36 
     37 
    3038#include "emu/emu_cpu.h" 
    3139#include "emu/emu_cpu_data.h" 
    32  
     40#include "emu/emu_memory.h" 
     41#include "emu/emu_string.h" 
    3342 
    3443int32_t instr_int_cd(struct emu_cpu *c, struct emu_cpu_instruction *i) 
    3544{ 
    3645//      printf("interrupt %02x %i\n",*i->imm8, *c->reg8[al]); 
     46//      uint32_t arg0 = c->reg[ecx]; 
     47 
     48 
    3749        switch ( *c->reg8[al] ) 
    3850        { 
     
    7789                break; 
    7890 
    79         case 11: 
    80                 printf("sys_execve\n"); 
     91        case 11: // sys_execve 
     92                { 
     93                        struct emu_string *name = emu_string_new(); 
     94                        emu_memory_read_string(emu_memory_get(c->emu), c->reg[ebx], name, 255); 
     95                        printf("int execve (const char *dateiname=%08x={%s}, const char * argv[], const char *envp[]);\n",  
     96                                   c->reg[ebx], 
     97                                   emu_string_char(name)); 
     98                } 
    8199                break; 
    82100 
     
    253271                break; 
    254272 
    255         case 63: 
    256                 printf("sys_dup2\n"); 
     273        case 63:  
     274                printf("int dup2(int oldfd=%i, int newfd=%i);\n", c->reg[ebx], c->reg[ecx]); 
     275                emu_cpu_reg32_set(c, eax, c->reg[ecx]); 
    257276                break; 
    258277 
     
    407426        case 102: 
    408427//              printf("sys_socketcall\n"); 
    409                 switch ( c->reg[ebx] ) 
    410428                { 
    411                 case 1: // SYS_SOCKET  
    412                         printf("sys_socket(2)\n"); 
    413                         break; 
    414  
    415                 case 2: // SYS_BIND  
    416                         printf("sys_bind(2)\n"); 
    417                         break; 
    418  
    419                 case 3: // SYS_CONNECT  
    420                         printf("sys_connect(2)\n"); 
    421                         break; 
    422  
    423                 case 4: // SYS_LISTEN  
    424                         printf("sys_listen(2)\n"); 
    425                         break; 
    426  
    427                 case 5: // SYS_ACCEPT  
    428                         printf("sys_accept(2)\n"); 
    429                         break; 
    430  
    431                 case 6: // SYS_GETSOCKNAME  
    432                         printf("sys_getsockname(2)\n"); 
    433                         break; 
    434  
    435                 case 7: // SYS_GETPEERNAME  
    436                         printf("sys_getpeername(2)\n"); 
    437                         break; 
    438  
    439                 case 8: // SYS_SOCKETPAIR  
    440                         printf("sys_socketpair(2)\n"); 
    441                         break; 
    442  
    443                 case 9: // SYS_SEND  
    444                         printf("sys_send(2)\n"); 
    445                         break; 
    446  
    447                 case 10: // SYS_RECV  
    448                         printf("sys_recv(2)\n"); 
    449                         break; 
    450  
    451                 case 11: // SYS_SENDTO  
    452                         printf("sys_sendto(2)\n"); 
    453                         break; 
    454  
    455                 case 12: // SYS_RECVFROM  
    456                         printf("sys_recvfrom(2)\n"); 
    457                         break; 
    458  
    459                 case 13: // SYS_SHUTDOWN  
    460                         printf("sys_shutdown(2)\n"); 
    461                         break; 
    462  
    463                 case 14: // SYS_SETSOCKOPT  
    464                         printf("sys_setsockopt(2)\n"); 
    465                         break; 
    466  
    467                 case 15: // SYS_GETSOCKOPT  
    468                         printf("sys_getsockopt(2)\n"); 
    469                         break; 
    470  
    471                 case 16: // SYS_SENDMSG  
    472                         printf("sys_sendmsg(2)\n"); 
    473                         break; 
    474  
    475                 case 17: // SYS_RECVMSG  
    476                         printf("sys_recvmsg(2)\n"); 
    477                         break; 
     429/* Argument list sizes for sys_socketcall */ 
     430#define AL(x) (x) 
     431                        static unsigned char nargs[18]={AL(0),AL(3),AL(3),AL(3),AL(2),AL(3), 
     432                                AL(3),AL(3),AL(4),AL(4),AL(4),AL(6), 
     433                                AL(6),AL(2),AL(5),AL(5),AL(3),AL(3)}; 
     434#undef AL 
     435 
     436                        uint32_t a[6]; 
     437                        int i; 
     438                        for (i=0;i<nargs[c->reg[ebx]];i++) 
     439                        { 
     440                                emu_memory_read_dword(emu_memory_get(c->emu),c->reg[ecx]+4*i,a+i); 
     441                        } 
     442 
     443                        switch ( c->reg[ebx] ) 
     444                        { 
     445                        case 1: // SYS_SOCKET  
     446                                printf("int socket(int domain=%i, int type=%i, int protocol=%i);\n", 
     447                                           a[0], 
     448                                           a[1], 
     449                                           a[2]); 
     450                                emu_cpu_reg32_set(c, eax, 4); 
     451                                break; 
     452 
     453                        case 2: // SYS_BIND  
     454                                printf("sys_bind(2)\n"); 
     455                                { 
     456                                        struct sockaddr sa; 
     457                                        memset(&sa, 0, sizeof(struct sockaddr)); 
     458                                        emu_memory_read_block(emu_memory_get(c->emu), a[1], &sa, sizeof(struct sockaddr)); 
     459 
     460                                        printf("int bind(int sockfd=%i, struct sockaddr *my_addr=%08x={host %s port %i}, int addrlen);\n", 
     461                                                   a[0], 
     462                                                   a[1], inet_ntoa(*(struct in_addr *)&((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port)  
     463                                                   ); 
     464                                } 
     465                                emu_cpu_reg32_set(c, eax, 0); 
     466                                break; 
     467 
     468                        case 3: // SYS_CONNECT  
     469                                { 
     470                                        struct sockaddr sa; 
     471                                        memset(&sa, 0, sizeof(struct sockaddr)); 
     472                                        emu_memory_read_block(emu_memory_get(c->emu), a[1], &sa, sizeof(struct sockaddr)); 
     473 
     474                                        printf("int connect(int sockfd=%i, struct sockaddr *my_addr=%08x={host %s port %i}, int addrlen);\n", 
     475                                                   a[0], 
     476                                                   a[1], inet_ntoa(*(struct in_addr *)&((struct sockaddr_in *)&sa)->sin_addr), ntohs(((struct sockaddr_in *)&sa)->sin_port) 
     477                                                   ); 
     478 
     479                                } 
     480                                break; 
     481 
     482                        case 4: // SYS_LISTEN  
     483                                printf("int listen(int s=%i, int backlog=%i);\n",  
     484                                           a[0],  
     485                                           a[1]); 
     486                                break; 
     487 
     488                        case 5: // SYS_ACCEPT  
     489                printf("int accept(int s=%i, struct sockaddr *addr=%08x, int *addrlen=%08x);\n", 
     490                                           a[0], 
     491                                           a[1], 
     492                                           a[2]); 
     493                                emu_cpu_reg32_set(c, eax, 112); 
     494                                break; 
     495 
     496                        case 6: // SYS_GETSOCKNAME  
     497                                printf("sys_getsockname(2)\n"); 
     498                                break; 
     499 
     500                        case 7: // SYS_GETPEERNAME  
     501                                printf("sys_getpeername(2)\n"); 
     502                                break; 
     503 
     504                        case 8: // SYS_SOCKETPAIR  
     505                                printf("sys_socketpair(2)\n"); 
     506                                break; 
     507 
     508                        case 9: // SYS_SEND  
     509                                printf("sys_send(2)\n"); 
     510                                break; 
     511 
     512                        case 10: // SYS_RECV  
     513                                printf("sys_recv(2)\n"); 
     514                                break; 
     515 
     516                        case 11: // SYS_SENDTO  
     517                                printf("sys_sendto(2)\n"); 
     518                                break; 
     519 
     520                        case 12: // SYS_RECVFROM  
     521                                printf("sys_recvfrom(2)\n"); 
     522                                break; 
     523 
     524                        case 13: // SYS_SHUTDOWN  
     525                                printf("sys_shutdown(2)\n"); 
     526                                break; 
     527 
     528                        case 14: // SYS_SETSOCKOPT  
     529                                printf("sys_setsockopt(2)\n"); 
     530                                break; 
     531 
     532                        case 15: // SYS_GETSOCKOPT  
     533                                printf("sys_getsockopt(2)\n"); 
     534                                break; 
     535 
     536                        case 16: // SYS_SENDMSG  
     537                                printf("sys_sendmsg(2)\n"); 
     538                                break; 
     539 
     540                        case 17: // SYS_RECVMSG  
     541                                printf("sys_recvmsg(2)\n"); 
     542                                break; 
     543                        } 
    478544                } 
    479545                break;