windows-pr 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +2 -0
- data/MANIFEST +20 -0
- data/README +117 -0
- data/doc/conversion_guide.txt +25 -0
- data/lib/windows/clipboard.rb +105 -0
- data/lib/windows/device_io.rb +141 -0
- data/lib/windows/error.rb +92 -0
- data/lib/windows/file.rb +290 -0
- data/lib/windows/handle.rb +47 -0
- data/lib/windows/memory.rb +92 -0
- data/lib/windows/msvcrt/buffer.rb +48 -0
- data/lib/windows/msvcrt/file.rb +18 -0
- data/lib/windows/path.rb +372 -0
- data/lib/windows/sound.rb +52 -0
- data/lib/windows/synchronize.rb +61 -0
- data/test/tc_error.rb +57 -0
- data/test/tc_msvcrt_buffer.rb +71 -0
- data/test/tc_path.rb +97 -0
- data/test/tc_synchronize.rb +43 -0
- data/test/ts_all.rb +10 -0
- metadata +67 -0
data/CHANGES
ADDED
data/MANIFEST
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
CHANGES
|
2
|
+
MANIFEST
|
3
|
+
README
|
4
|
+
install.rb
|
5
|
+
windows-pr.gemspec
|
6
|
+
|
7
|
+
doc/conversion_guide.txt
|
8
|
+
|
9
|
+
lib/windows/clipboard.rb
|
10
|
+
lib/windows/device_io.rb
|
11
|
+
lib/windows/error.rb
|
12
|
+
lib/windows/file.rb
|
13
|
+
lib/windows/handle.rb
|
14
|
+
lib/windows/memory.rb
|
15
|
+
lib/windows/path.rb
|
16
|
+
lib/windows/sound.rb
|
17
|
+
lib/windows/synchronize.rb
|
18
|
+
|
19
|
+
lib/windows/msvcrt/buffer.rb
|
20
|
+
lib/windows/msvcrt/file.rb
|
data/README
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
= windows-pr
|
2
|
+
== Description
|
3
|
+
A collection of Windows functions predefined for you via Win32API. Hence,
|
4
|
+
the 'pr', for 'Pure Ruby'.
|
5
|
+
|
6
|
+
== Synopsis
|
7
|
+
require 'windows/path'
|
8
|
+
|
9
|
+
class Foo
|
10
|
+
include Windows::Path
|
11
|
+
|
12
|
+
if PathIsRoot.call("C:\\") > 0
|
13
|
+
...
|
14
|
+
end
|
15
|
+
|
16
|
+
# or
|
17
|
+
|
18
|
+
if PathIsRoot("C:\\")
|
19
|
+
...
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
== Methods
|
24
|
+
Each of the various files included as part of this package provide a series
|
25
|
+
of constants corresponding to the equivalent Windows API function and
|
26
|
+
related numeric constants. For example, if you require 'windows/path',
|
27
|
+
you now have PathIsRoot, PathIsUNC, etc, available to you as Win32API
|
28
|
+
objects in the form of constants.
|
29
|
+
|
30
|
+
A wrapper has been provided for each method in order to avoid the
|
31
|
+
Win32API#call method. So, instead of PathIsRoot.call(path) you can
|
32
|
+
invoke it as PathIsRoot(path). If the original function is lower case
|
33
|
+
then the wrapper method is lower case as well. For example, instead of
|
34
|
+
doing 'Memcpy.call(dest, src, size)' you can do 'memcpy(dest, src, size)'.
|
35
|
+
|
36
|
+
Remember boys and girls, if you write PathIsRoot, you're referring to
|
37
|
+
the constant. If you write PathIsRoot(), you're calling the wrapper
|
38
|
+
method.
|
39
|
+
|
40
|
+
Boolean methods automatically perform a check for success or failure. So,
|
41
|
+
instead of having to do something like 'if PathIsRoot(path) > 0' you can
|
42
|
+
just do 'if PathIsRoot(path)'.
|
43
|
+
|
44
|
+
Files contain related functions, by topic. For example, the clipboard.rb
|
45
|
+
file contains clipboard related functions, such as CloseClipboard(), as
|
46
|
+
well as constants such as CF_TEXT, CF_BITMAP, etc.
|
47
|
+
|
48
|
+
== Where are the tests, dude?
|
49
|
+
While I've made some effort to test these functions, there are simply too
|
50
|
+
many for me to effectively test them all. We're ultimately talking about
|
51
|
+
hundreds, if not thousands, of functions, and I don't know what all of them
|
52
|
+
actually do. That being said, I will add tests where and when I can.
|
53
|
+
|
54
|
+
If you find that I've declared the function prototype wrong for a given
|
55
|
+
function, please let me know ASAP and I'll fix it. An example program
|
56
|
+
demonstrating the problem would be helpful, too. Or, if you'd just like
|
57
|
+
to contribute some test cases, that's fine as well.
|
58
|
+
|
59
|
+
== What's the point?
|
60
|
+
I became tired of redefining Windows functions over and over whenever I
|
61
|
+
wanted to use the Win32API package. I thought it would be very handy to
|
62
|
+
have them predefined for me in a package with convenient wrapper methods
|
63
|
+
to boot.
|
64
|
+
|
65
|
+
While it's true that Moonwolf has a package on the RAA that includes many
|
66
|
+
of these functions defined already, there are a few issues with it. First,
|
67
|
+
it puts *every* function and constant in one or two files. That's a waste
|
68
|
+
of memory, hard to organize & maintain, and impossible to test. Second,
|
69
|
+
some of his function declarations are wrong. Third, some of the functions
|
70
|
+
I needed for my own projects are missing. Fourth, there's no gem. Lastly,
|
71
|
+
I haven't seen an update in over 5 years, which leads me to believe it is
|
72
|
+
no longer maintained.
|
73
|
+
|
74
|
+
== Hey, I'm missing function X!
|
75
|
+
I have only defined a small subset of the overall Windows API. It would
|
76
|
+
take me years to define them *all*. I defined the ones I needed first,
|
77
|
+
plus some that I thought would be useful to others. I will continue to
|
78
|
+
add functions in my spare time, or (especially) by request.
|
79
|
+
|
80
|
+
== Bugs
|
81
|
+
None that I'm aware of. Please report any bugs on the project page at
|
82
|
+
http://www.rubyforge.org/projects/win32utils.
|
83
|
+
|
84
|
+
The only real bugs you could find are either bad prototype declarations
|
85
|
+
or bad constant values. But, please report either.
|
86
|
+
|
87
|
+
== Known Issues
|
88
|
+
In some cases the MSDN docs are wrong, and we have to learn it the hard
|
89
|
+
way. If you should happen to find a documentation bug on their site,
|
90
|
+
please contact them and let them know. They're generally good about fixing
|
91
|
+
them.
|
92
|
+
|
93
|
+
In other cases library functions are not exported by the dll. For example,
|
94
|
+
my version of shlwapi.dll does not export the PathIsHTMLFile() function,
|
95
|
+
despite being well past the minimum version for that dll file. There is
|
96
|
+
nothing you or I can do about it short of rebuilding the dll file from
|
97
|
+
scratch and/or reporting the issue to Microsoft.
|
98
|
+
|
99
|
+
== Supported Platforms
|
100
|
+
I only support the Windows NT familiy of Windows, and really only Windows
|
101
|
+
2000 and later, though I'll make an effort to support NT 4 if there are
|
102
|
+
any NT 4 related issues and requests to support it.
|
103
|
+
|
104
|
+
== License
|
105
|
+
Ruby's
|
106
|
+
|
107
|
+
== Warranty
|
108
|
+
This package is provided "as is" and without any express or
|
109
|
+
implied warranties, including, without limitation, the implied
|
110
|
+
warranties of merchantability and fitness for a particular purpose.
|
111
|
+
|
112
|
+
== Copyright
|
113
|
+
(C) 2006, Daniel J. Berger
|
114
|
+
All Rights Reserved
|
115
|
+
|
116
|
+
== Author
|
117
|
+
Daniel Berger
|
@@ -0,0 +1,25 @@
|
|
1
|
+
= Parameters
|
2
|
+
Long: 'N' or 'L'
|
3
|
+
Integer: 'I'
|
4
|
+
Pointer: 'P'
|
5
|
+
Void: 'V'
|
6
|
+
|
7
|
+
= Windows Data Types
|
8
|
+
BOOL => 'I'
|
9
|
+
DWORD => 'L'
|
10
|
+
HANDLE => 'L'
|
11
|
+
LPDWORD => 'P'
|
12
|
+
LPTSTR => 'P'
|
13
|
+
UINT => 'I'
|
14
|
+
VOID => 'V'
|
15
|
+
WORD => 'I'
|
16
|
+
|
17
|
+
= C Data Types
|
18
|
+
void => 'V'
|
19
|
+
void* => 'P'
|
20
|
+
char* => 'P'
|
21
|
+
const char* => 'L'
|
22
|
+
int => 'I'
|
23
|
+
long => 'L'
|
24
|
+
struct => 'P'
|
25
|
+
struct* => 'P'
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#############################################################################
|
2
|
+
# clipboard.rb
|
3
|
+
#
|
4
|
+
# Includes the following functions:
|
5
|
+
#
|
6
|
+
# CloseClipboard()
|
7
|
+
# CoundClipboardFormats()
|
8
|
+
# EmptyClipboard()
|
9
|
+
# EnumClipboardFormats()
|
10
|
+
# GetClipboardData()
|
11
|
+
# GetClipboardFormatName()
|
12
|
+
# IsClipboardFormatAvailable()
|
13
|
+
# OpenClipboard()
|
14
|
+
# RegisterClipboardFormat()
|
15
|
+
# SetClipboardData()
|
16
|
+
#
|
17
|
+
# Defines the following constants:
|
18
|
+
#
|
19
|
+
# CF_TEXT
|
20
|
+
# CF_BITMAP
|
21
|
+
# CF_METAFILEPICT
|
22
|
+
# CF_SYLK
|
23
|
+
# CF_DIF
|
24
|
+
# CF_TIFF
|
25
|
+
# CF_OEMTEXT
|
26
|
+
# CF_DIB
|
27
|
+
# CF_PALETTE
|
28
|
+
# CF_PENDATA
|
29
|
+
# CF_RIFF
|
30
|
+
# CF_WAVE
|
31
|
+
# CF_UNICODETEXT
|
32
|
+
# CF_ENHMETAFILE
|
33
|
+
#############################################################################
|
34
|
+
require 'Win32API'
|
35
|
+
|
36
|
+
module Windows
|
37
|
+
module Clipboard
|
38
|
+
CF_TEXT = 1
|
39
|
+
CF_BITMAP = 2
|
40
|
+
CF_METAFILEPICT = 3
|
41
|
+
CF_SYLK = 4
|
42
|
+
CF_DIF = 5
|
43
|
+
CF_TIFF = 6
|
44
|
+
CF_OEMTEXT = 7
|
45
|
+
CF_DIB = 8
|
46
|
+
CF_PALETTE = 9
|
47
|
+
CF_PENDATA = 10
|
48
|
+
CF_RIFF = 11
|
49
|
+
CF_WAVE = 12
|
50
|
+
CF_UNICODETEXT = 13
|
51
|
+
CF_ENHMETAFILE = 14
|
52
|
+
|
53
|
+
OpenClipboard = Win32API.new('user32', 'OpenClipboard', 'L', 'I')
|
54
|
+
CloseClipboard = Win32API.new('user32', 'CloseClipboard', 'V', 'I')
|
55
|
+
GetClipboardData = Win32API.new('user32', 'GetClipboardData', 'I', 'P')
|
56
|
+
EmptyClipboard = Win32API.new('user32', 'EmptyClipboard', 'V', 'I')
|
57
|
+
SetClipboardData = Win32API.new('user32', 'SetClipboardData', 'II', 'I')
|
58
|
+
|
59
|
+
CountClipboardFormats = Win32API.new('user32', 'CountClipboardFormats', 'V', 'I')
|
60
|
+
IsClipboardFormatAvailable = Win32API.new('user32', 'IsClipboardFormatAvailable', 'I', 'I')
|
61
|
+
GetClipboardFormatName = Win32API.new('user32', 'GetClipboardFormatName', 'IPI', 'I')
|
62
|
+
EnumClipboardFormats = Win32API.new('user32', 'EnumClipboardFormats', 'I', 'I')
|
63
|
+
RegisterClipboardFormat = Win32API.new('user32', 'RegisterClipboardFormat', 'P', 'I')
|
64
|
+
|
65
|
+
def OpenClipboard(handle)
|
66
|
+
OpenClipboard.call(handle) > 0
|
67
|
+
end
|
68
|
+
|
69
|
+
def CloseClipboard
|
70
|
+
CloseClipboard.call > 0
|
71
|
+
end
|
72
|
+
|
73
|
+
def GetClipboardData(format)
|
74
|
+
GetClipboardData.call(format)
|
75
|
+
end
|
76
|
+
|
77
|
+
def EmptyClipboard
|
78
|
+
EmptyClipboard.call > 0
|
79
|
+
end
|
80
|
+
|
81
|
+
def SetClipboardData(format, handle)
|
82
|
+
SetClipboardData.call(format, handle)
|
83
|
+
end
|
84
|
+
|
85
|
+
def CountClipboardFormats
|
86
|
+
CountClipboardFormats.call
|
87
|
+
end
|
88
|
+
|
89
|
+
def IsClipboardFormatAvailable(format)
|
90
|
+
IsClipboardFormatAvailable.call(format) > 0
|
91
|
+
end
|
92
|
+
|
93
|
+
def GetClipboardFormatName(format, format_name, max)
|
94
|
+
GetClipboardFormatName.call(format, format_name, max)
|
95
|
+
end
|
96
|
+
|
97
|
+
def EnumClipboardFormats(format)
|
98
|
+
EnumClipboardFormats.call(format)
|
99
|
+
end
|
100
|
+
|
101
|
+
def RegisterClipboardFormat(format)
|
102
|
+
RegisterClipboardFormat.call(format)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
#####################################################################
|
2
|
+
# device_io.rb
|
3
|
+
#
|
4
|
+
# Defines the following functions:
|
5
|
+
#
|
6
|
+
# DeviceIoControl()
|
7
|
+
#
|
8
|
+
# Defines the following constants:
|
9
|
+
#
|
10
|
+
# FILE_DEVICE_BEEP = 0x00000001
|
11
|
+
# FILE_DEVICE_CD_ROM = 0x00000002
|
12
|
+
# FILE_DEVICE_CD_ROM_FILE_SYSTEM = 0x00000003
|
13
|
+
# FILE_DEVICE_CONTROLLER = 0x00000004
|
14
|
+
# FILE_DEVICE_DATALINK = 0x00000005
|
15
|
+
# FILE_DEVICE_DFS = 0x00000006
|
16
|
+
# FILE_DEVICE_DISK = 0x00000007
|
17
|
+
# FILE_DEVICE_DISK_FILE_SYSTEM = 0x00000008
|
18
|
+
# FILE_DEVICE_FILE_SYSTEM = 0x00000009
|
19
|
+
# FILE_DEVICE_INPORT_PORT = 0x0000000a
|
20
|
+
# FILE_DEVICE_KEYBOARD = 0x0000000b
|
21
|
+
# FILE_DEVICE_MAILSLOT = 0x0000000c
|
22
|
+
# FILE_DEVICE_MIDI_IN = 0x0000000d
|
23
|
+
# FILE_DEVICE_MIDI_OUT = 0x0000000e
|
24
|
+
# FILE_DEVICE_MOUSE = 0x0000000f
|
25
|
+
# FILE_DEVICE_MULTI_UNC_PROVIDER = 0x00000010
|
26
|
+
# FILE_DEVICE_NAMED_PIPE = 0x00000011
|
27
|
+
# FILE_DEVICE_NETWORK = 0x00000012
|
28
|
+
# FILE_DEVICE_NETWORK_BROWSER = 0x00000013
|
29
|
+
# FILE_DEVICE_NETWORK_FILE_SYSTEM = 0x00000014
|
30
|
+
# FILE_DEVICE_NULL = 0x00000015
|
31
|
+
# FILE_DEVICE_PARALLEL_PORT = 0x00000016
|
32
|
+
# FILE_DEVICE_PHYSICAL_NETCARD = 0x00000017
|
33
|
+
# FILE_DEVICE_PRINTER = 0x00000018
|
34
|
+
# FILE_DEVICE_SCANNER = 0x00000019
|
35
|
+
# FILE_DEVICE_SERIAL_MOUSE_PORT = 0x0000001a
|
36
|
+
# FILE_DEVICE_SERIAL_PORT = 0x0000001b
|
37
|
+
# FILE_DEVICE_SCREEN = 0x0000001c
|
38
|
+
# FILE_DEVICE_SOUND = 0x0000001d
|
39
|
+
# FILE_DEVICE_STREAMS = 0x0000001e
|
40
|
+
# FILE_DEVICE_TAPE = 0x0000001f
|
41
|
+
# FILE_DEVICE_TAPE_FILE_SYSTEM = 0x00000020
|
42
|
+
# FILE_DEVICE_TRANSPORT = 0x00000021
|
43
|
+
# FILE_DEVICE_UNKNOWN = 0x00000022
|
44
|
+
# FILE_DEVICE_VIDEO = 0x00000023
|
45
|
+
# FILE_DEVICE_VIRTUAL_DISK = 0x00000024
|
46
|
+
# FILE_DEVICE_WAVE_IN = 0x00000025
|
47
|
+
# FILE_DEVICE_WAVE_OUT = 0x00000026
|
48
|
+
# FILE_DEVICE_8042_PORT = 0x00000027
|
49
|
+
# FILE_DEVICE_NETWORK_REDIRECTOR = 0x00000028
|
50
|
+
# FILE_DEVICE_BATTERY = 0x00000029
|
51
|
+
# FILE_DEVICE_BUS_EXTENDER = 0x0000002a
|
52
|
+
# FILE_DEVICE_MODEM = 0x0000002b
|
53
|
+
# FILE_DEVICE_VDM = 0x0000002c
|
54
|
+
# FILE_DEVICE_MASS_STORAGE = 0x0000002d
|
55
|
+
# FILE_DEVICE_SMB = 0x0000002e
|
56
|
+
# FILE_DEVICE_KS = 0x0000002f
|
57
|
+
# FILE_DEVICE_CHANGER = 0x00000030
|
58
|
+
# FILE_DEVICE_SMARTCARD = 0x00000031
|
59
|
+
# FILE_DEVICE_ACPI = 0x00000032
|
60
|
+
# FILE_DEVICE_DVD = 0x00000033
|
61
|
+
# FILE_DEVICE_FULLSCREEN_VIDEO = 0x00000034
|
62
|
+
# FILE_DEVICE_DFS_FILE_SYSTEM = 0x00000035
|
63
|
+
# FILE_DEVICE_DFS_VOLUME = 0x00000036
|
64
|
+
# FILE_DEVICE_SERENUM = 0x00000037
|
65
|
+
# FILE_DEVICE_TERMSRV = 0x00000038
|
66
|
+
# FILE_DEVICE_KSEC = 0x00000039
|
67
|
+
# FILE_DEVICE_FIPS = 0x0000003A
|
68
|
+
# FILE_DEVICE_INFINIBAND = 0x0000003B
|
69
|
+
#####################################################################
|
70
|
+
require 'Win32API'
|
71
|
+
|
72
|
+
module Windows
|
73
|
+
module DeviceIO
|
74
|
+
# Device Types
|
75
|
+
FILE_DEVICE_BEEP = 0x00000001
|
76
|
+
FILE_DEVICE_CD_ROM = 0x00000002
|
77
|
+
FILE_DEVICE_CD_ROM_FILE_SYSTEM = 0x00000003
|
78
|
+
FILE_DEVICE_CONTROLLER = 0x00000004
|
79
|
+
FILE_DEVICE_DATALINK = 0x00000005
|
80
|
+
FILE_DEVICE_DFS = 0x00000006
|
81
|
+
FILE_DEVICE_DISK = 0x00000007
|
82
|
+
FILE_DEVICE_DISK_FILE_SYSTEM = 0x00000008
|
83
|
+
FILE_DEVICE_FILE_SYSTEM = 0x00000009
|
84
|
+
FILE_DEVICE_INPORT_PORT = 0x0000000a
|
85
|
+
FILE_DEVICE_KEYBOARD = 0x0000000b
|
86
|
+
FILE_DEVICE_MAILSLOT = 0x0000000c
|
87
|
+
FILE_DEVICE_MIDI_IN = 0x0000000d
|
88
|
+
FILE_DEVICE_MIDI_OUT = 0x0000000e
|
89
|
+
FILE_DEVICE_MOUSE = 0x0000000f
|
90
|
+
FILE_DEVICE_MULTI_UNC_PROVIDER = 0x00000010
|
91
|
+
FILE_DEVICE_NAMED_PIPE = 0x00000011
|
92
|
+
FILE_DEVICE_NETWORK = 0x00000012
|
93
|
+
FILE_DEVICE_NETWORK_BROWSER = 0x00000013
|
94
|
+
FILE_DEVICE_NETWORK_FILE_SYSTEM = 0x00000014
|
95
|
+
FILE_DEVICE_NULL = 0x00000015
|
96
|
+
FILE_DEVICE_PARALLEL_PORT = 0x00000016
|
97
|
+
FILE_DEVICE_PHYSICAL_NETCARD = 0x00000017
|
98
|
+
FILE_DEVICE_PRINTER = 0x00000018
|
99
|
+
FILE_DEVICE_SCANNER = 0x00000019
|
100
|
+
FILE_DEVICE_SERIAL_MOUSE_PORT = 0x0000001a
|
101
|
+
FILE_DEVICE_SERIAL_PORT = 0x0000001b
|
102
|
+
FILE_DEVICE_SCREEN = 0x0000001c
|
103
|
+
FILE_DEVICE_SOUND = 0x0000001d
|
104
|
+
FILE_DEVICE_STREAMS = 0x0000001e
|
105
|
+
FILE_DEVICE_TAPE = 0x0000001f
|
106
|
+
FILE_DEVICE_TAPE_FILE_SYSTEM = 0x00000020
|
107
|
+
FILE_DEVICE_TRANSPORT = 0x00000021
|
108
|
+
FILE_DEVICE_UNKNOWN = 0x00000022
|
109
|
+
FILE_DEVICE_VIDEO = 0x00000023
|
110
|
+
FILE_DEVICE_VIRTUAL_DISK = 0x00000024
|
111
|
+
FILE_DEVICE_WAVE_IN = 0x00000025
|
112
|
+
FILE_DEVICE_WAVE_OUT = 0x00000026
|
113
|
+
FILE_DEVICE_8042_PORT = 0x00000027
|
114
|
+
FILE_DEVICE_NETWORK_REDIRECTOR = 0x00000028
|
115
|
+
FILE_DEVICE_BATTERY = 0x00000029
|
116
|
+
FILE_DEVICE_BUS_EXTENDER = 0x0000002a
|
117
|
+
FILE_DEVICE_MODEM = 0x0000002b
|
118
|
+
FILE_DEVICE_VDM = 0x0000002c
|
119
|
+
FILE_DEVICE_MASS_STORAGE = 0x0000002d
|
120
|
+
FILE_DEVICE_SMB = 0x0000002e
|
121
|
+
FILE_DEVICE_KS = 0x0000002f
|
122
|
+
FILE_DEVICE_CHANGER = 0x00000030
|
123
|
+
FILE_DEVICE_SMARTCARD = 0x00000031
|
124
|
+
FILE_DEVICE_ACPI = 0x00000032
|
125
|
+
FILE_DEVICE_DVD = 0x00000033
|
126
|
+
FILE_DEVICE_FULLSCREEN_VIDEO = 0x00000034
|
127
|
+
FILE_DEVICE_DFS_FILE_SYSTEM = 0x00000035
|
128
|
+
FILE_DEVICE_DFS_VOLUME = 0x00000036
|
129
|
+
FILE_DEVICE_SERENUM = 0x00000037
|
130
|
+
FILE_DEVICE_TERMSRV = 0x00000038
|
131
|
+
FILE_DEVICE_KSEC = 0x00000039
|
132
|
+
FILE_DEVICE_FIPS = 0x0000003A
|
133
|
+
FILE_DEVICE_INFINIBAND = 0x0000003B
|
134
|
+
|
135
|
+
DeviceIoControl = Win32API.new('kernel32', 'DeviceIoControl', 'LLPLPLPP', 'I')
|
136
|
+
|
137
|
+
def DeviceIoControl(dev, code, in_buf, in_buf_size, out_buf, out_buf_size, bytes, overlapped)
|
138
|
+
DeviceIoControl.call(dev, code, in_buf, in_buf_size, out_buf, out_buf_size, bytes, overlapped)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
############################################################################
|
2
|
+
# error.rb
|
3
|
+
#
|
4
|
+
# Includes the following functions:
|
5
|
+
#
|
6
|
+
# GetLastError()
|
7
|
+
# FormatError()
|
8
|
+
# SetErrorMode()
|
9
|
+
# SetLastError()
|
10
|
+
# SetLastErrorex()
|
11
|
+
#
|
12
|
+
# Defines the following constants:
|
13
|
+
#
|
14
|
+
# FORMAT_MESSAGE_ALLOCATE_BUFFER
|
15
|
+
# FORMAT_MESSAGE_IGNORE_INSERTS
|
16
|
+
# FORMAT_MESSAGE_FROM_STRING
|
17
|
+
# FORMAT_MESSAGE_FROM_HMODULE
|
18
|
+
# FORMAT_MESSAGE_FROM_SYSTEM
|
19
|
+
# FORMAT_MESSAGE_ARGUMENT_ARRAY
|
20
|
+
# FORMAT_MESSAGE_MAX_WIDTH_MASK
|
21
|
+
#
|
22
|
+
# SEM_FAILCRITICALERRORS
|
23
|
+
# SEM_NOALIGNMENTFAULTEXCEPT
|
24
|
+
# SEM_NOGPFAULTERRORBOX
|
25
|
+
# SEM_NOOPENFILEERRORBOX
|
26
|
+
#
|
27
|
+
# Adds the following convenience methods:
|
28
|
+
#
|
29
|
+
# get_last_error - Returns a human readable string for the error returned
|
30
|
+
# by the GetLastError() function.
|
31
|
+
############################################################################
|
32
|
+
require "Win32API"
|
33
|
+
|
34
|
+
module Windows
|
35
|
+
module Error
|
36
|
+
FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100
|
37
|
+
FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200
|
38
|
+
FORMAT_MESSAGE_FROM_STRING = 0x00000400
|
39
|
+
FORMAT_MESSAGE_FROM_HMODULE = 0x00000800
|
40
|
+
FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
|
41
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000
|
42
|
+
FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF
|
43
|
+
|
44
|
+
SEM_FAILCRITICALERRORS = 0x0001
|
45
|
+
SEM_NOALIGNMENTFAULTEXCEPT = 0x0004
|
46
|
+
SEM_NOGPFAULTERRORBOX = 0x0002
|
47
|
+
SEM_NOOPENFILEERRORBOX = 0x8000
|
48
|
+
|
49
|
+
GetLastError = Win32API.new('kernel32', 'GetLastError', 'V', 'L')
|
50
|
+
SetLastError = Win32API.new('kernel32', 'GetLastError', 'L', 'V')
|
51
|
+
SetLastErrorEx = Win32API.new('kernel32', 'GetLastError', 'LL', 'V')
|
52
|
+
SetErrorMode = Win32API.new('kernel32', 'SetErrorMode', 'I', 'I')
|
53
|
+
FormatMessage = Win32API.new('kernel32', 'FormatMessage', 'LPLLPLP', 'L')
|
54
|
+
|
55
|
+
def GetLastError
|
56
|
+
GetLastError.call
|
57
|
+
end
|
58
|
+
|
59
|
+
def SetLastError(error)
|
60
|
+
SetLastError.call(error)
|
61
|
+
end
|
62
|
+
|
63
|
+
def SetLastErrorEx(error, type=0)
|
64
|
+
SetLastErrorEx.call(error, type)
|
65
|
+
end
|
66
|
+
|
67
|
+
def SetErrorMode(mode)
|
68
|
+
SetErrorMode.call(mode)
|
69
|
+
end
|
70
|
+
|
71
|
+
def FormatMessage(flags, src, msg_id, lang_id, buf, size, args)
|
72
|
+
FormatMessage.call(flags, src, msg_id, lang_id, buf, size, args)
|
73
|
+
end
|
74
|
+
|
75
|
+
# Convenience method that wraps FormatMessage with some sane defaults and
|
76
|
+
# returns a human readable string.
|
77
|
+
#
|
78
|
+
def get_last_error(err_num = GetLastError.call)
|
79
|
+
buf = 0.chr * 260
|
80
|
+
FormatMessage.call(
|
81
|
+
FORMAT_MESSAGE_FROM_SYSTEM + FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
82
|
+
0,
|
83
|
+
err_num,
|
84
|
+
0,
|
85
|
+
buf,
|
86
|
+
buf.length,
|
87
|
+
0
|
88
|
+
)
|
89
|
+
buf.split(0.chr).first.chomp
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|