@@ -30,6 +30,11 @@ import Swift
30
30
typealias Address = UInt64
31
31
typealias Size = UInt64
32
32
33
+ /// Fill the specified buffer with data from the specified location in
34
+ /// the source.
35
+ func fetch( from address: Address ,
36
+ into buffer: UnsafeMutableRawBufferPointer ) throws
37
+
33
38
/// Fill the specified buffer with data from the specified location in
34
39
/// the source.
35
40
func fetch< T> ( from address: Address ,
@@ -51,6 +56,11 @@ import Swift
51
56
52
57
extension MemoryReader {
53
58
59
+ public func fetch< T> ( from address: Address ,
60
+ into buffer: UnsafeMutableBufferPointer < T > ) throws {
61
+ try fetch ( from: address, into: UnsafeMutableRawBufferPointer ( buffer) )
62
+ }
63
+
54
64
public func fetch< T> ( from addr: Address ,
55
65
into pointer: UnsafeMutablePointer < T > ) throws {
56
66
try fetch ( from: addr,
@@ -96,10 +106,12 @@ extension MemoryReader {
96
106
@_spi ( MemoryReaders) public struct UnsafeLocalMemoryReader : MemoryReader {
97
107
public init ( ) { }
98
108
99
- public func fetch< T> ( from address: Address ,
100
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
101
- buffer. baseAddress!. update ( from: UnsafePointer < T > ( bitPattern: UInt ( address) ) !,
102
- count: buffer. count)
109
+ public func fetch( from address: Address ,
110
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
111
+ buffer. baseAddress!. copyMemory (
112
+ from: UnsafeRawPointer ( bitPattern: UInt ( address) ) !,
113
+ byteCount: buffer. count
114
+ )
103
115
}
104
116
}
105
117
@@ -116,9 +128,9 @@ extension MemoryReader {
116
128
self . task = task as! task_t
117
129
}
118
130
119
- public func fetch< T > ( from address: Address ,
120
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
121
- let size = UInt64 ( MemoryLayout < T > . stride * buffer. count)
131
+ public func fetch( from address: Address ,
132
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
133
+ let size = buffer. count
122
134
var sizeOut = UInt64 ( 0 )
123
135
let result = mach_vm_read_overwrite ( task,
124
136
UInt64 ( address) ,
@@ -138,8 +150,8 @@ extension MemoryReader {
138
150
public typealias Address = UInt64
139
151
public typealias Size = UInt64
140
152
141
- public func fetch< T > ( from address: Address ,
142
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
153
+ public func fetch( from address: Address ,
154
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
143
155
let reader = RemoteMemoryReader ( task: mach_task_self ( ) )
144
156
return try reader. fetch ( from: address, into: buffer)
145
157
}
@@ -221,34 +233,31 @@ extension MemoryReader {
221
233
return response
222
234
}
223
235
224
- public func fetch< T> ( from addr: Address ,
225
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
226
- try buffer. withMemoryRebound ( to: UInt8 . self) {
227
- let bytes = UnsafeMutableRawBufferPointer ( $0)
228
- try sendRequest ( for: Size ( bytes. count) , from: addr)
236
+ public func fetch( from addr: Address ,
237
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
238
+ try sendRequest ( for: Size ( buffer. count) , from: addr)
229
239
230
- var done = 0
231
- while done < bytes. count {
232
- let reply = try receiveReply ( )
233
-
234
- if reply. len < 0 {
235
- throw MemserverError ( message: " Unreadable at \( hex ( addr) ) " )
236
- }
240
+ var done = 0
241
+ while done < buffer. count {
242
+ let reply = try receiveReply ( )
237
243
238
- if done + Int ( reply. len) > bytes . count {
239
- throw MemserverError ( message: " Overrun at \( hex ( addr) ) trying to read \( bytes . count ) bytes " )
240
- }
244
+ if reply. len < 0 {
245
+ throw MemserverError ( message: " Unreadable at \( hex ( addr) ) " )
246
+ }
241
247
242
- let ret = try safeRead ( fd ,
243
- UnsafeMutableRawBufferPointer (
244
- rebasing : bytes [ done ..< done + Int ( reply . len ) ] ) )
248
+ if buffer . count - done < Int ( reply . len ) {
249
+ throw MemserverError ( message : " Overrun at \( hex ( addr ) ) trying to read \( buffer . count ) bytes " )
250
+ }
245
251
246
- if ret != reply . len {
247
- throw MemserverError ( message : " Channel closed prematurely " )
248
- }
252
+ let ret = try safeRead ( fd ,
253
+ UnsafeMutableRawBufferPointer (
254
+ rebasing : buffer [ done ..< done + Int ( reply . len ) ] ) )
249
255
250
- done += Int ( reply. len)
256
+ if ret != reply. len {
257
+ throw MemserverError ( message: " Channel closed prematurely " )
251
258
}
259
+
260
+ done += Int ( reply. len)
252
261
}
253
262
}
254
263
}
@@ -260,9 +269,9 @@ extension MemoryReader {
260
269
self . pid = pid as! pid_t
261
270
}
262
271
263
- public func fetch< T > ( from address: Address ,
264
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
265
- let size = size_t ( MemoryLayout < T > . stride * buffer. count)
272
+ public func fetch( from address: Address ,
273
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
274
+ let size = buffer. count
266
275
var fromIOVec = iovec ( iov_base: UnsafeMutableRawPointer (
267
276
bitPattern: UInt ( address) ) ,
268
277
iov_len: size)
@@ -281,8 +290,8 @@ extension MemoryReader {
281
290
reader = RemoteMemoryReader ( pid: getpid ( ) )
282
291
}
283
292
284
- public func fetch< T > ( from address: Address ,
285
- into buffer: UnsafeMutableBufferPointer < T > ) throws {
293
+ public func fetch( from address: Address ,
294
+ into buffer: UnsafeMutableRawBufferPointer ) throws {
286
295
return try reader. fetch ( from: address, into: buffer)
287
296
}
288
297
}
0 commit comments