cstruct 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/doc/documents.html +572 -0
  2. data/doc/examples/anonymous_struct.rb.html +94 -0
  3. data/doc/examples/anonymous_union.rb.html +93 -0
  4. data/doc/examples/array_member.rb.html +79 -0
  5. data/doc/examples/file_io.rb.html +87 -0
  6. data/doc/examples/first_example.rb.html +104 -0
  7. data/doc/examples/get_system_info.rb.html +114 -0
  8. data/doc/examples/get_versionex.rb.html +97 -0
  9. data/doc/examples/global_memory.rb.html +102 -0
  10. data/doc/examples/inner_struct.rb.html +79 -0
  11. data/doc/examples/inner_union.rb.html +77 -0
  12. data/doc/examples/namespace.rb.html +80 -0
  13. data/doc/examples/show_processes.rb.html +95 -0
  14. data/doc/examples/struct_member.rb.html +128 -0
  15. data/doc/examples.html +42 -0
  16. data/doc/images/Thumbs.db +0 -0
  17. data/doc/images/examples.png +0 -0
  18. data/doc/images/excample1.png +0 -0
  19. data/doc/images/excample2.png +0 -0
  20. data/doc/images/green-point.png +0 -0
  21. data/doc/images/learnmore.png +0 -0
  22. data/doc/images/logo.png +0 -0
  23. data/doc/images/news.png +0 -0
  24. data/doc/images/point.png +0 -0
  25. data/doc/images/start.png +0 -0
  26. data/doc/images/synopsish.png +0 -0
  27. data/doc/index.html +149 -0
  28. data/doc/stylesheets/coderay.css +34 -0
  29. data/doc/stylesheets/ie.css +9 -0
  30. data/doc/stylesheets/style.css +216 -0
  31. data/examples/anonymous_struct.rb +43 -0
  32. data/examples/anonymous_union.rb +42 -0
  33. data/examples/array_member.rb +29 -0
  34. data/examples/file_io.rb +49 -0
  35. data/examples/first_example.rb +53 -0
  36. data/examples/inner_struct.rb +28 -0
  37. data/examples/inner_union.rb +26 -0
  38. data/examples/namespace.rb +29 -0
  39. data/examples/struct_member.rb +77 -0
  40. data/examples/win32/get_system_info.rb +64 -0
  41. data/examples/win32/get_versionex.rb +47 -0
  42. data/examples/win32/global_memory.rb +51 -0
  43. data/examples/win32/show_processes.rb +45 -0
  44. data/lib/cstruct.rb +523 -0
  45. data/lib/win32struct.rb +90 -0
  46. data/lib/win64struct.rb +13 -0
  47. metadata +109 -0
data/lib/cstruct.rb ADDED
@@ -0,0 +1,523 @@
1
+ #--
2
+ # Copyright (c) 2010 Wang Yong
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining
5
+ # a copy of this software and associated documentation files (the
6
+ # "Software"), to deal in the Software without restriction, including
7
+ # without limitation the rights to use, copy, modify, merge, publish,
8
+ # distribute, sublicense, and/or sell copies of the Software, and to
9
+ # permit persons to whom the Software is furnished to do so, subject to
10
+ # the following conditions:
11
+ #
12
+ # The above copyright notice and this permission notice shall be
13
+ # included in all copies or substantial portions of the Software.
14
+ #
15
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ #++
23
+
24
+ ###############################################
25
+ # CStruct
26
+ # Author: Wang Yong (skandhas)
27
+ # CStruct Homepage: cstruct.rubyforge.org
28
+ # E-Mail: skandhas@163.com
29
+ ###############################################
30
+
31
+ require 'enumerator'
32
+
33
+ class CStruct
34
+
35
+ VERSION = '1.0.0'
36
+
37
+ public
38
+ def self.options opt_hash
39
+ raise 'Data Type Error!' unless opt_hash.is_a? Hash
40
+ @endian = opt_hash[:endian] if opt_hash.has_key?:endian
41
+ raise 'Unsupported Endian!' if @endian!=:little and @endian!=:big
42
+ @align = opt_hash[:align] if opt_hash.has_key?:align
43
+ end
44
+
45
+ def self.endian
46
+ @endian
47
+ end
48
+
49
+ def self.align
50
+ @align
51
+ end
52
+
53
+ def self.field_hash
54
+ @fields
55
+ end
56
+
57
+ private
58
+
59
+ def self.init_class_var
60
+ @size = 0
61
+ @fields = {}
62
+ @endian = :little # :little or :big
63
+ @align = 1 # Unsupport in this version
64
+ end
65
+
66
+ def self.field symbol,fsize,fsign,dimension = nil
67
+ if dimension.is_a? Array
68
+ do_arrayfield symbol,fsize,fsign,dimension
69
+ else
70
+ do_field symbol,fsize,fsign
71
+ end
72
+ end
73
+
74
+ def self.structfield symbol,sclass,ssize,dimension = nil
75
+ if dimension.is_a? Array
76
+ do_arraystructfield symbol,sclass,ssize,dimension
77
+ else
78
+ do_structfield symbol,sclass,ssize
79
+ end
80
+ end
81
+
82
+ def self.inherited clazz
83
+ clazz.init_class_var
84
+ end
85
+
86
+ def self.method_missing(method, *args)
87
+ sclass = method_to_class_by_class self,method
88
+ sclass = method_to_class_by_class Object,method unless sclass
89
+ sclass = method_to_class_by_namespace method unless sclass
90
+ sclass = method_to_class method unless sclass
91
+ super unless sclass
92
+ is_cstruct = sclass.ancestors.select{|x| x == CStruct }
93
+ if is_cstruct
94
+ symbol,dimension = *args
95
+ structfield symbol,sclass,sclass.size,dimension
96
+ else
97
+ super
98
+ end
99
+ end
100
+
101
+ def self.method_to_class_by_class clazz,method
102
+ in_object_class = false
103
+ if RUBY_VERSION < '1.9'
104
+ in_object_class = clazz.constants.include? method.to_s
105
+ else
106
+ in_object_class = clazz.constants.include? method
107
+ end
108
+ return nil unless in_object_class
109
+ clazz.const_get method
110
+ end
111
+
112
+
113
+ # X::Y::A
114
+ def self.method_to_class_by_namespace method
115
+ sclass = nil
116
+ class_name_array = self.to_s.split('::')
117
+ return nil if class_name_array.size < 2
118
+ class_array = []
119
+ class_name_array.pop
120
+ class_name_array.inject(self){|m,class_name| class_array << m.const_get(class_name.to_sym); class_array.last }
121
+ class_array.reverse_each do |clazz|
122
+ if clazz.const_defined?(method)
123
+ sclass = clazz.const_get(method)
124
+ break
125
+ end
126
+ end
127
+ sclass
128
+ end
129
+
130
+ # X_Y_A
131
+ def self.method_to_class method
132
+
133
+ super_namespace = nil
134
+ class_name_array = self.to_s.split('::')
135
+
136
+ if class_name_array.size < 2
137
+ super_namespace = Object
138
+ else
139
+ class_name_array.pop
140
+ super_namespace = class_name_array.inject(Object) {|m,class_name| m.const_get(class_name.to_sym) }
141
+ end
142
+
143
+ namespace_name_array = method.to_s.split('_')
144
+ return nil if namespace_name_array.size < 2
145
+ sclass = namespace_name_array.inject(super_namespace) {|m,class_name| m.const_get(class_name.to_sym) }
146
+ end
147
+
148
+ def self.do_field symbol,fsize,fsign
149
+ foffset = @size
150
+ @size += fsize
151
+ @fields[symbol] = [fsize,foffset,fsign,nil]
152
+
153
+ define_method(symbol) { normal_field_to_value(symbol) }
154
+ define_method("#{symbol}=") { |value| value_to_field(symbol,value) }
155
+ end
156
+
157
+ def self.do_arrayfield symbol,fsize,fsign,dimension
158
+ bytesize = fsize * dimension.inject(1){|m,i| m*=i}
159
+ foffset = @size
160
+ @size += bytesize
161
+ @fields[symbol] = [fsize,foffset,fsign,dimension,bytesize]
162
+
163
+ define_method(symbol) { array_field_to_value(symbol) }
164
+ define_method("#{symbol}=") { |value| value_to_arrayfield(symbol,value) }
165
+ end
166
+
167
+ def self.do_structfield symbol,sclass,ssize
168
+ foffset = @size
169
+ @size += ssize
170
+ @fields[symbol] = [ssize,foffset,:ignore,nil]
171
+
172
+ define_method(symbol) { struct_field_to_value(symbol,sclass)}
173
+ define_method("#{symbol}=") { |value| value_to_struct_field(symbol,sclass,value)}
174
+ end
175
+
176
+ def self.do_arraystructfield symbol,sclass,ssize,dimension
177
+ bytesize= ssize * dimension.inject(1){|m,i| m*=i}
178
+ foffset = @size
179
+ @size += bytesize
180
+ @fields[symbol] = [ssize,foffset,:ignore,dimension,bytesize]
181
+
182
+ define_method(symbol) { array_struct_field_to_value(symbol,sclass) }
183
+ define_method("#{symbol}=") { |value| value_to_array_struct_field(symbol,sclass,value) }
184
+ end
185
+
186
+ def self.unsigned symbol,fsize,dimension
187
+ field symbol,fsize,:unsigned,dimension
188
+ end
189
+
190
+ def self.signed symbol,fsize,dimension
191
+ field symbol,fsize,:signed,dimension
192
+ end
193
+
194
+ public
195
+
196
+ def self.size
197
+ @size
198
+ end
199
+
200
+ class<<self
201
+ alias_method :__size__, :size
202
+
203
+ [1,2,4,8].each do |i|
204
+ define_method "unsigned_#{i}byte" do |*args| # |symbol,dimension=nil|
205
+ symbol,dimension = args
206
+ unsigned symbol,i,dimension
207
+ end
208
+ define_method "signed_#{i}byte" do |*args| # |symbol,dimension=nil|
209
+ symbol,dimension = args
210
+ signed symbol,i,dimension
211
+ end
212
+ end
213
+
214
+ def float(*args) # |symbol,dimension=nil|
215
+ symbol,dimension = args
216
+ field symbol,4,:float,dimension
217
+ end
218
+ def double(*args) # |symbol,dimension=nil|
219
+ symbol,dimension = args
220
+ field symbol,8,:double,dimension
221
+ end
222
+
223
+ alias uint64 unsigned_8byte
224
+ alias uint32 unsigned_4byte
225
+ alias uint16 unsigned_2byte
226
+ alias uint8 unsigned_1byte
227
+ alias uchar unsigned_1byte
228
+
229
+ alias int64 signed_8byte
230
+ alias int32 signed_4byte
231
+ alias int16 signed_2byte
232
+ alias int8 signed_1byte
233
+ alias char signed_1byte
234
+ end
235
+
236
+ # call init_class_var
237
+ init_class_var
238
+
239
+ # module Utils
240
+ module Utils #:nodoc: all
241
+ UnpackFormat =
242
+ {
243
+ :little => { 1=>'C',2=>'v',4=>'V',8=>'Q',:float=>'e',:double=>'E'},
244
+ :big => { 1=>'C',2=>'n',4=>'N',8=>'Q',:float=>'g',:double=>'G'}, #8=>'Q'? 'Q' is native endian
245
+ }
246
+ SigedMaxValue = { 1 => 0x7F, 2 => 0x7FFF, 4 => 0x7FFFFFFF, 8 => 0x7FFFFFFFFFFFFFFF }
247
+ UnsigedMaxValue = { 1 => 0xFF, 2 => 0xFFFF, 4 => 0xFFFFFFFF, 8 => 0xFFFFFFFFFFFFFFFF }
248
+
249
+ # buffer is a String's object
250
+ def self.unpack buffer,struct_endian,fsize,fsign
251
+ value =nil
252
+ if fsign==:float or fsign ==:double
253
+ format = UnpackFormat[struct_endian][fsign]
254
+ value = buffer.unpack(format)[0]
255
+ else
256
+ format = UnpackFormat[struct_endian][fsize]
257
+ value = buffer.unpack(format)[0]
258
+ if fsign == :signed
259
+ value = unsigned_to_signed value,fsize
260
+ end
261
+ end
262
+ value
263
+ end
264
+
265
+ # buffer is a Array's object
266
+ def self.pack buffer,struct_endian,fsize,fsign
267
+ if fsign==:float or fsign ==:double
268
+ format = UnpackFormat[struct_endian][fsign]
269
+ else
270
+ format = UnpackFormat[struct_endian][fsize]
271
+ end
272
+ buffer.pack format
273
+ end
274
+
275
+ # dosen't use monkey patch~
276
+ def self.string_setbyte string ,index,value
277
+ if RUBY_VERSION < "1.9"
278
+ string[index] = value
279
+ else
280
+ string.setbyte index,value
281
+ end
282
+ end
283
+ def self.string_getbyte string ,index
284
+ if RUBY_VERSION < "1.9"
285
+ string[index]
286
+ else
287
+ string.getbyte index
288
+ end
289
+ end
290
+
291
+ def self.unsigned_to_signed value,value_size
292
+ if value>SigedMaxValue[value_size]
293
+ ret = value - UnsigedMaxValue[value_size]-1
294
+ else
295
+ ret = value
296
+ end
297
+
298
+ end
299
+ def self.buffer_setbytes(target,source,targetindex)
300
+ source.enum_for(:each_byte).each_with_index do |byte,index|
301
+ string_setbyte(target,targetindex + index,byte)
302
+ end
303
+ end
304
+ end # module Utils
305
+
306
+ public
307
+ # instance methods
308
+ attr_accessor:owner
309
+ def initialize
310
+ @data = "\0"*self.class.size
311
+ @owner = []
312
+ @data.encode!("BINARY") if RUBY_VERSION >= '1.9'
313
+
314
+ yield self if block_given?
315
+ end
316
+
317
+ def data
318
+ @data
319
+ end
320
+
321
+ def reset
322
+ (0...self.class.size).each do |i|
323
+ CStruct::Utils.string_setbyte @data,i, 0
324
+ end
325
+ sync_to_owner
326
+ end
327
+
328
+ def data= bindata
329
+ raise 'Data Type Error!' unless bindata.is_a? String
330
+ self << bindata
331
+ end
332
+
333
+ def << bindata
334
+ count = @data.size < bindata.size ? @data.size : bindata.size
335
+ (0...count).each do |i|
336
+ CStruct::Utils.string_setbyte @data,i, CStruct::Utils.string_getbyte(bindata,i)
337
+ end
338
+ end
339
+
340
+ def sync_to_owner
341
+ return if @owner.empty?
342
+ final_offset = @owner.inject(0) do |sum,owner_value|
343
+ _,foffset,_ = owner_value
344
+ sum+= foffset
345
+ end
346
+ onwerdata,_,_ = @owner.last
347
+ CStruct::Utils.buffer_setbytes onwerdata,@data,final_offset
348
+ end
349
+
350
+ alias __data__ data
351
+ alias __reset__ reset
352
+ alias __data__= data=
353
+
354
+ private
355
+
356
+ def normal_field_to_value symbol
357
+ make_normal_field(self.class.field_hash[symbol],self.class.endian)
358
+ end
359
+
360
+ def array_field_to_value symbol
361
+ make_array_normal_field(self.class.field_hash[symbol],self.class.endian)
362
+ end
363
+
364
+ def struct_field_to_value symbol,sclass
365
+ make_struct_field(self.class.field_hash[symbol],self.class.endian,sclass)
366
+ end
367
+ def array_struct_field_to_value symbol,sclass
368
+ make_array_struct_field(self.class.field_hash[symbol],self.class.endian,sclass)
369
+ end
370
+
371
+ def value_to_field symbol,value
372
+ dataref = @data
373
+ onwerref = @owner
374
+ self.class.class_eval do
375
+ fsize,foffset,fsign = *@fields[symbol]
376
+ bin_string = CStruct::Utils::pack [value],@endian,fsize,fsign
377
+ CStruct::Utils.buffer_setbytes dataref,bin_string,foffset
378
+ end
379
+ sync_to_owner
380
+ end
381
+
382
+
383
+ def value_to_arrayfield symbol,value
384
+
385
+ fsize,foffset,fsign,dimension,array_bytesize = *self.class.field_hash[symbol]
386
+ array_length = array_bytesize/fsize
387
+
388
+ if (fsize==1) && (value.is_a? String)
389
+ if value.length >= array_length
390
+ puts "WARNING: \"#{value}\".length(#{value.length}) >= #{symbol}.length(#{dimension})!!"
391
+ end
392
+ value = value[0...array_length-1]
393
+ CStruct::Utils.buffer_setbytes @data,value,foffset
394
+ sync_to_owner
395
+ else
396
+ raise "No Implement!(CStruct,version:#{CStruct::VERSION})"
397
+ end
398
+ end
399
+
400
+ def value_to_struct_field symbol,sclass,value
401
+ raise "No Implement!(CStruct,version:#{CStruct::VERSION})"
402
+ end
403
+
404
+ def value_to_array_struct_field symbol,sclass,value
405
+ raise "No Implement!(CStruct,version:#{CStruct::VERSION})"
406
+ end
407
+
408
+ def make_normal_field finfo,sendian,sclass = nil # finfo =[fsize,foffset,fsign,dimension,array_bytesize]
409
+ fsize,foffset,fsign = finfo
410
+ CStruct::Utils::unpack(@data[foffset,fsize],sendian,fsize,fsign)
411
+ end
412
+
413
+ def make_struct_field finfo,sendian,sclass # finfo =[fsize,foffset,fsign,dimension,array_bytesize]
414
+ value = sclass.new
415
+ ssize,foffset,ignore = finfo
416
+ value << @data[foffset,ssize]
417
+ value.owner << [@data,foffset,ssize]
418
+ if self.owner.size > 0
419
+ value.owner += self.owner
420
+ end
421
+ value
422
+ end
423
+
424
+ def make_array_normal_field finfo,sendian,sclass = nil # finfo =[fsize,foffset,fsign,dimension,array_bytesize]
425
+ dataref = @data
426
+ objref = self
427
+ value = buffer_to_values finfo,sendian
428
+ def value.metaclass
429
+ class<<self; self; end
430
+ end
431
+
432
+ value.metaclass.__send__ :define_method,:[]= do |i,v|
433
+ fsize,foffset,fsign = finfo
434
+ bin_string = CStruct::Utils::pack [v],sendian,fsize,fsign
435
+ CStruct::Utils.buffer_setbytes dataref,bin_string,foffset + i * fsize
436
+ objref.sync_to_owner
437
+ end
438
+
439
+ value.metaclass.__send__ :define_method,:to_cstr do value.pack("C#{value.index(0)}") end if finfo[0] == 1
440
+
441
+ if RUBY_VERSION > "1.9"
442
+ utf_endian = {:little=>"LE",:big=>"BE"}
443
+ value.metaclass.__send__ :define_method,:to_wstr do
444
+ value.pack("S#{value.index(0)}").force_encoding("UTF-16#{utf_endian[sendian]}")
445
+ end if finfo[0] == 2
446
+
447
+ value.metaclass.__send__ :define_method,:to_wstr do
448
+ value.pack("L#{value.index(0)}").force_encoding("UTF-32#{utf_endian[sendian]}")
449
+ end if finfo[0] == 4
450
+ end
451
+
452
+ value
453
+ end
454
+
455
+ def make_array_struct_field finfo,sendian,sclass # finfo =[fsize,foffset,fsign,dimension,array_bytesize]
456
+ value = buffer_to_structs finfo,sendian,sclass
457
+ end
458
+
459
+ def buffer_to_single_value fsize,foffset,iterator,sendian,fsign
460
+ CStruct::Utils::unpack(@data[foffset + iterator * fsize,fsize],sendian,fsize,fsign)
461
+ end
462
+
463
+ def buffer_to_values finfo,sendian # finfo =[fsize,foffset,fsign,dimension,array_bytesize]
464
+ value =[]
465
+ fsize,foffset,fsign,dimension,bytesize = * finfo
466
+ (0...bytesize/fsize).each do |i|
467
+ value << buffer_to_single_value(fsize,foffset,i,sendian,fsign)
468
+ end
469
+ value
470
+ end
471
+
472
+ def buffer_to_single_struct sclass,ssize,soffset,iterator,sendian,fsign
473
+ value = sclass.new
474
+ value << @data[soffset + iterator * ssize,ssize]
475
+
476
+ value.owner << [@data,soffset + iterator * ssize,ssize]
477
+
478
+ if self.owner.size > 0
479
+ value.owner += self.owner
480
+ end
481
+ value
482
+ end
483
+
484
+ def buffer_to_structs finfo,sendian,sclass # finfo =[ssize,soffset,ssign,dimension,array_bytesize]
485
+ value =[]
486
+ ssize,soffset,ssign,dimension,bytesize = finfo
487
+ (0...bytesize/ssize).each do |i|
488
+ value << buffer_to_single_struct(sclass,ssize,soffset,i,sendian,ssign)
489
+ end
490
+ value
491
+ end
492
+ end
493
+
494
+ def CStruct.union symbol,&block
495
+ union_super = self.ancestors[1]
496
+ union_class = Class.new(union_super) do
497
+ def self.change_to_union
498
+ @fields.each do|k,v|
499
+ v[1] = 0
500
+ @fields[k] = v
501
+ end
502
+ max_field_size = @fields.values.inject(0)do |max,v|
503
+ dimension = v[3]
504
+ dimension_product = 1
505
+ dimension_product = dimension.inject(1){|m,d| m *= d } if dimension.is_a? Array
506
+ field_size = v[0]* dimension_product
507
+ max = (field_size> max ? field_size : max)
508
+ end
509
+ @size = max_field_size
510
+ end
511
+ end
512
+ union_class.instance_eval(&block)
513
+ union_class.instance_eval{change_to_union}
514
+ do_structfield symbol,union_class,union_class.size
515
+ end
516
+
517
+ def CStruct.struct symbol,&block
518
+ struct_super = self.ancestors[1]
519
+ struct_class = Class.new(struct_super)
520
+ struct_class.instance_eval(&block)
521
+ do_structfield symbol,struct_class,struct_class.size
522
+ end
523
+
@@ -0,0 +1,90 @@
1
+ ###############################################
2
+ # Win32Struct
3
+ # - TWS(Type-Wrapper-Struct) for win32
4
+ #
5
+ # Author: Wang Yong (skandhas)
6
+ # CStruct Homepage: cstruct.rubyforge.org
7
+ # E-Mail: skandhas@163.com
8
+ ###############################################
9
+
10
+ require "cstruct"
11
+ class Win32Struct< CStruct
12
+
13
+ class << self
14
+
15
+ # Handle
16
+ alias HANDLE uint32
17
+ alias HMODULE uint32
18
+ alias HINSTANCE uint32
19
+ alias HRGN uint32
20
+ alias HTASK uint32
21
+ alias HKEY uint32
22
+ alias HDESK uint32
23
+ alias HMF uint32
24
+ alias HEMF uint32
25
+ alias HRSRC uint32
26
+ alias HSTR uint32
27
+ alias HWINSTA uint32
28
+ alias HKL uint32
29
+ alias HGDIOBJ uint32
30
+
31
+ alias HICON uint32
32
+ alias HPEN uint32
33
+ alias HACCEL uint32
34
+ alias HBITMAP uint32
35
+ alias HBRUSH uint32
36
+ alias HCOLORSPACE uint32
37
+ alias HDC uint32
38
+ alias HGLRC uint32
39
+ alias HENHMETAFILE uint32
40
+ alias HFONT uint32
41
+ alias HMENU uint32
42
+ alias HMETAFILE uint32
43
+ alias HPALETTE uint32
44
+ alias HCURSOR uint32
45
+
46
+ # Data Type
47
+ alias WPARAM uint32
48
+ alias LPARAM uint32
49
+ alias LRESULT uint32
50
+ alias ATOM uint32
51
+
52
+ alias BOOL uint32
53
+ alias DWORD uint32
54
+ alias WORD uint16
55
+ alias BYTE uint8
56
+
57
+ alias ULONG uint32
58
+ alias UINT uint32
59
+ alias USHORT uint16
60
+ alias UCHAR uchar
61
+
62
+ alias LONG int32
63
+ alias INT int32
64
+ alias SHORT int16
65
+ alias CHAR char
66
+ alias WCHAR uint16
67
+
68
+ # Pointer
69
+ alias DWORD_PTR uint32
70
+ alias ULONG_PTR uint32
71
+ alias UINT_PTR uint32
72
+ alias PHANDLE uint32
73
+
74
+ alias PBOOL uint32
75
+ alias LPBOOL uint32
76
+ alias PBYTE uint32
77
+ alias LPBYTE uint32
78
+ alias PINT uint32
79
+ alias LPINT uint32
80
+ alias PWORD uint32
81
+ alias LPWORD uint32
82
+ alias LPLONG uint32
83
+ alias PDWORD uint32
84
+ alias LPDWORD uint32
85
+ alias LPVOID uint32
86
+ alias LPCVOID uint32
87
+ alias LPCSTR uint32
88
+
89
+ end
90
+ end
@@ -0,0 +1,13 @@
1
+ ###############################################
2
+ # Win64Struct
3
+ # - TWS(Type-Wrapper-Struct) for win64
4
+ #
5
+ # Author: Wang Yong (skandhas)
6
+ # CStruct Homepage: cstruct.rubyforge.org
7
+ # E-Mail: skandhas@163.com
8
+ ###############################################
9
+
10
+ require "cstruct"
11
+ class Win64Struct< CStruct
12
+ "No Implement!"
13
+ end