GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: a tiny graphical app kit for ruby
Homepage: http://code.whytheluckystiff.net/shoes
Clone URL: git://github.com/why/shoes.git
 * req/binject/ext/binject_c/binject.c: get EXE generation working on 
 big-endian.
why (author)
Thu Jul 10 15:59:01 -0700 2008
commit  1d01ab6031dec0ccbd475a7c75c7246b9281c598
tree    db9a2832ac79b3dd785468a617f6e0eef07f1b46
parent  1a8338d2b239897fd786e77bdc5a76dceff3ef2f
...
108
109
110
 
 
111
112
113
114
115
116
117
118
119
120
121
122
123
 
124
125
126
...
181
182
183
184
 
185
186
187
 
 
 
188
189
190
191
192
 
 
 
193
194
195
...
334
335
336
 
 
 
 
337
338
339
...
351
352
353
 
 
354
355
356
...
358
359
360
 
 
361
362
363
364
365
366
 
 
367
368
369
...
373
374
375
 
376
377
378
379
380
 
 
 
381
382
 
383
384
385
386
387
 
 
388
389
390
391
 
392
393
394
 
 
 
395
396
397
398
 
 
 
 
 
 
399
400
401
402
 
 
403
404
405
...
423
424
425
 
 
 
 
426
427
428
...
439
440
441
 
 
 
 
442
443
444
...
447
448
449
 
 
450
451
452
...
463
464
465
 
 
 
466
467
468
...
472
473
474
475
 
476
477
478
479
480
 
481
482
483
 
 
484
485
486
...
490
491
492
 
 
493
494
495
...
554
555
556
 
557
 
558
 
559
 
560
561
 
562
563
 
564
 
565
 
566
567
568
...
108
109
110
111
112
113
114
115
116
 
117
118
119
120
121
122
 
 
123
124
125
126
...
181
182
183
 
184
185
 
 
186
187
188
189
190
191
 
 
192
193
194
195
196
197
...
336
337
338
339
340
341
342
343
344
345
...
357
358
359
360
361
362
363
364
...
366
367
368
369
370
371
372
373
374
375
 
376
377
378
379
380
...
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
 
409
410
411
412
413
414
415
416
417
 
 
418
419
420
421
422
423
424
425
 
 
426
427
428
429
430
...
448
449
450
451
452
453
454
455
456
457
...
468
469
470
471
472
473
474
475
476
477
...
480
481
482
483
484
485
486
487
...
498
499
500
501
502
503
504
505
506
...
510
511
512
 
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
...
531
532
533
534
535
536
537
538
...
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
0
@@ -108,19 +108,19 @@ binject_exe_resources(binject_exe_t *binj, int offset, int level, int res_type)
0
 {
0
   int count = 0, i = 0;
0
   BINJ_READ_POS(binj, binj->resource_dir, binj->section_header.PointerToRawData + offset);
0
+ FLIPENDIANLE(binj->resource_dir.NumberOfNamedEntries);
0
+ FLIPENDIANLE(binj->resource_dir.NumberOfIdEntries);
0
   if (level == 1)
0
     binj->ids++;
0
   if (level == 2)
0
     binj->resids++;
0
- // print_resource_dir(&binj->resource_dir, 0);
0
 
0
   offset += 16;
0
   count = binj->resource_dir.NumberOfNamedEntries + binj->resource_dir.NumberOfIdEntries;
0
   for (i = 0; i < count; i++)
0
   {
0
     BINJ_READ_POS(binj, binj->resource_dir_entry, binj->section_header.PointerToRawData + offset);
0
- // if (res_type == 0 || res_type == 10 || res_type == 6)
0
- // print_resource_dir_entry(&binj->resource_dir_entry, level);
0
+ FLIPENDIANLE(binj->resource_dir_entry.OffsetToData);
0
 
0
     if ((binj->resource_dir_entry.OffsetToData & 0x80000000) == 0)
0
     {
0
@@ -181,15 +181,17 @@ binject_exe_write_name(binject_exe_t *binj, char *out, VALUE klass, int index)
0
 {
0
   long i;
0
   char *str;
0
- unsigned int *datlen;
0
+ unsigned short int *datlen;
0
   VALUE key = binject_exe_get_key(binj, klass, index);
0
- datlen = (unsigned int *)(out + binj->namestart);
0
- *datlen = (unsigned int)RSTRING_LEN(key);
0
+ datlen = (unsigned short int *)(out + binj->namestart);
0
+ *datlen = (unsigned short int)RSTRING_LEN(key);
0
+ FLIPENDIANLE(*datlen);
0
   str = RSTRING_PTR(key);
0
   for (i = 0; i < RSTRING_LEN(key); i++)
0
   {
0
- datlen = (unsigned int *)(out + binj->namestart + 2 + (i * 2));
0
- *datlen = (unsigned int)str[i];
0
+ datlen = (unsigned short int *)(out + binj->namestart + 2 + (i * 2));
0
+ *datlen = (unsigned short int)str[i];
0
+ FLIPENDIANLE(*datlen);
0
   }
0
   return 2 + (RSTRING_LEN(key) * 2);
0
 }
0
@@ -334,6 +336,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
   struct resource_data_t *rdat, *rdat2;
0
   // printf("DIR[%d]: %x TO %x\n", level, offset, offset2);
0
   BINJ_COPY(rd2, rd, struct resource_dir_t, offset, offset2);
0
+ FLIPENDIANLE(rd->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd->NumberOfNamedEntries);
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
   if (level == 0)
0
   {
0
     ins = binject_exe_new_ids(binj);
0
@@ -351,6 +357,8 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
   {
0
     ins = RARRAY_LEN(binj->adds);
0
   }
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
 
0
   offset += 16;
0
   offset2 += 16;
0
@@ -358,12 +366,15 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
   for (i = 0; i < count; i++)
0
   {
0
     rde = (struct resource_dir_entry_t *)(buf + offset);
0
+ FLIPENDIANLE(rde->Name);
0
+ FLIPENDIANLE(rde->OffsetToData);
0
     if (level == 0)
0
       res_type = rde->Name;
0
     if (level == 0 && res_type > 10 && ins > 0)
0
     {
0
       VALUE obj, key, ctype;
0
- unsigned int ti = 0, i2 = 0, doff = 0, doff2 = 0, btype = 0, oc = 0, padlen = 0, oo = 0;
0
+ unsigned int ti = 0, i2 = 0, doff = 0, doff2 = 0, doff3 = 0, doff4 = 0,
0
+ btype = 0, oc = 0, padlen = 0, oo = 0;
0
       for (ti = 0; ti < 2; ti++)
0
       {
0
         ctype = (ti == 0 ? rb_cString : rb_cFile);
0
@@ -373,33 +384,47 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
         {
0
           rde = (struct resource_dir_entry_t *)(buf + offset);
0
           rde2 = (struct resource_dir_entry_t *)(out + offset2);
0
+
0
           rde2->Name = btype;
0
           rde2->OffsetToData = rde->OffsetToData + binject_exe_offset(binj, 0, btype) + (ti * 16) + (oc * 8);
0
           // printf("STRING ENTRY[0] @ %x (%u, %x)\n", (char *)rde2 - out, rde2->Name, rde2->OffsetToData);
0
           oo = rde->OffsetToData & 0x7fffffff;
0
           doff = rde2->OffsetToData & 0x7fffffff;
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
+
0
           rd2 = (struct resource_dir_t *)(out + doff);
0
           rd2->NumberOfNamedEntries = binject_exe_count_type(binj, ctype);
0
+ FLIPENDIANLE(rd2->NumberOfNamedEntries);
0
           // printf("STRING DIR[1]: %x\n", doff);
0
 
0
           for (i2 = 0; i2 < binject_exe_count_type(binj, ctype); i2++)
0
           {
0
             rde = (struct resource_dir_entry_t *)(buf + oo + 16);
0
+ doff3 = rde->OffsetToData;
0
+ FLIPENDIANLE(doff3);
0
             rde2 = (struct resource_dir_entry_t *)(out + doff + 16 + (i2 * 8));
0
             // printf("STRING ENTRY[1] @ %x / NAME(%x)\n", (char *)rde2 - out, binj->namestart);
0
             rde2->Name = 0x80000000 | binj->namestart;
0
- rde2->OffsetToData = rde->OffsetToData + binject_exe_offset(binj, 1, btype) + (oc * 24);
0
+ rde2->OffsetToData = doff3 + binject_exe_offset(binj, 1, btype) + (oc * 24);
0
             binj->namestart += binject_exe_write_name(binj, out, ctype, i2);
0
 
0
             doff2 = rde2->OffsetToData & 0x7fffffff;
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
+
0
             rd2 = (struct resource_dir_t *)(out + doff2);
0
             rd2->NumberOfIdEntries = 1;
0
- // printf("STRING DIR[2]: %x / %x (%x)\n", rde2->Name, rde2->OffsetToData, rde->OffsetToData);
0
- rde = (struct resource_dir_entry_t *)(buf + (rde->OffsetToData & 0x7fffffff) + 16);
0
+ FLIPENDIANLE(rd2->NumberOfIdEntries);
0
+ // printf("STRING DIR[2]: %x / %x (%x)\n", rde2->Name, rde2->OffsetToData, doff3);
0
+ rde = (struct resource_dir_entry_t *)(buf + (doff3 & 0x7fffffff) + 16);
0
+ doff4 = rde->OffsetToData;
0
+ FLIPENDIANLE(doff4);
0
+
0
             rde2 = (struct resource_dir_entry_t *)(out + doff2 + 16);
0
             // printf("STRING ENTRY[2] @ %x\n", (char *)rde2 - out);
0
- rde2->OffsetToData = rde->OffsetToData + binject_exe_offset(binj, 2, btype) + (oc * 16);
0
- // printf("RESDATA: %x / %x\n", rde->OffsetToData, rde2->OffsetToData);
0
+ rde2->OffsetToData = doff4 + binject_exe_offset(binj, 2, btype) + (oc * 16);
0
+ // printf("RESDATA: %x / %x\n", doff4, rde2->OffsetToData);
0
             obj = binject_exe_get_type(binj, ctype, i2);
0
             // printf("DATA: %x\n", binj->datapos);
0
             rdat = (struct resource_data_t *)(out + (rde2->OffsetToData));
0
@@ -423,6 +448,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
               binject_exe_string_copy(binj, pe_pad, padlen, binj->datapos, binj->proc);
0
               binj->datapos += padlen;
0
             }
0
+
0
+ FLIPENDIANLE(rdat->Size);
0
+ FLIPENDIANLE(rdat->OffsetToData);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
             oc++;
0
           }
0
           offset2 += 8;
0
@@ -439,6 +468,10 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
     {
0
       unsigned int dataoff = offset2 + rde2->OffsetToData;
0
       BINJ_COPY(rdat2, rdat, struct resource_data_t, rde->OffsetToData, rde2->OffsetToData);
0
+ FLIPENDIANLE(rdat->Size);
0
+ FLIPENDIANLE(rdat->OffsetToData);
0
+ FLIPENDIANLE(rdat2->Size);
0
+ FLIPENDIANLE(rdat2->OffsetToData);
0
       rdat2->OffsetToData = binj->datapos + binj->vdelta;
0
       // printf("RESDATA: %x TO %x AT %x / %x\n", rde->OffsetToData, rde2->OffsetToData,
0
       // binj->namestart, binj->datastart);
0
@@ -447,6 +480,8 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
       // printf("DATA: %x TO %x\n", rdat->OffsetToData, binj->datapos);
0
       binj->datapos += rdat->Size;
0
       binj->dataend = (rdat->OffsetToData - binj->vdelta) + rdat->Size;
0
+ FLIPENDIANLE(rdat2->Size);
0
+ FLIPENDIANLE(rdat2->OffsetToData);
0
     }
0
     else
0
     {
0
@@ -463,6 +498,9 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
           res_type);
0
       }
0
     }
0
+
0
+ FLIPENDIANLE(rde2->Name);
0
+ FLIPENDIANLE(rde2->OffsetToData);
0
     offset += 8;
0
     offset2 += 8;
0
   }
0
@@ -472,15 +510,18 @@ binject_exe_rewrite(binject_exe_t *binj, char *buf, char *out, int offset, int o
0
 VALUE
0
 binject_exe_load(VALUE self, VALUE file)
0
 {
0
- int i;
0
+ int i, lfanew;
0
   binject_exe_t *binj;
0
   Data_Get_Struct(self, binject_exe_t, binj);
0
   binj->file = rb_fopen(RSTRING_PTR(file), "rb");
0
 
0
   BINJ_READ(binj, binj->dos_header);
0
+ FLIPENDIANLE(binj->dos_header.e_lfanew);
0
   fseek(binj->file, binj->dos_header.e_lfanew, SEEK_SET);
0
   BINJ_READ(binj, binj->signature);
0
   BINJ_READ(binj, binj->image_file_header);
0
+ FLIPENDIANLE(binj->image_file_header.SizeOfOptionalHeader);
0
+ FLIPENDIANLE(binj->image_file_header.NumberOfSections);
0
   if (binj->image_file_header.SizeOfOptionalHeader != 0)
0
   {
0
     fread(&binj->image_optional_header, sizeof(char),
0
@@ -490,6 +531,8 @@ binject_exe_load(VALUE self, VALUE file)
0
   for (i = 0; i < binj->image_file_header.NumberOfSections; i++)
0
   {
0
     BINJ_READ(binj, binj->section_header);
0
+ FLIPENDIANLE(binj->section_header.VirtualAddress);
0
+ FLIPENDIANLE(binj->section_header.PointerToRawData);
0
 
0
     if (strcmp(binj->section_header.Name, ".rsrc") == 0)
0
       binject_exe_resources(binj, 0, 0, 0);
0
@@ -554,15 +597,23 @@ binject_exe_save(VALUE self, VALUE file)
0
   fseek(binj->out, 0, SEEK_SET);
0
   fread(buf, sizeof(char), 1024, binj->file);
0
   unsigned int *uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 32));
0
+ FLIPENDIANLE(*uninit);
0
   *uninit += grow - binj->vdelta;
0
+ FLIPENDIANLE(*uninit);
0
   uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 80));
0
+ FLIPENDIANLE(*uninit);
0
   *uninit += grow;
0
+ FLIPENDIANLE(*uninit);
0
   int *resd = (int *)(buf + (binj->dos_header.e_lfanew + 140));
0
   *resd = actual;
0
+ FLIPENDIANLE(*resd);
0
   resd = (int *)(buf + (binj->dos_header.e_lfanew + 376));
0
   *resd = actual;
0
+ FLIPENDIANLE(*resd);
0
   uninit = (unsigned int *)(buf + (binj->dos_header.e_lfanew + 384));
0
+ FLIPENDIANLE(*uninit);
0
   *uninit += grow;
0
+ FLIPENDIANLE(*uninit);
0
   fwrite(buf, sizeof(char), 1024, binj->out);
0
 
0
   fseek(binj->out, binj->datapos, SEEK_SET);

Comments

    No one has commented yet.