File tree 5 files changed +53
-25
lines changed
5 files changed +53
-25
lines changed Original file line number Diff line number Diff line change @@ -7,6 +7,8 @@ package windows
7
7
import (
8
8
"syscall"
9
9
"unsafe"
10
+
11
+ "golang.org/x/sys/internal/unsafeheader"
10
12
)
11
13
12
14
const (
@@ -1230,7 +1232,13 @@ func (sd *SECURITY_DESCRIPTOR) String() string {
1230
1232
return ""
1231
1233
}
1232
1234
defer LocalFree (Handle (unsafe .Pointer (sddl )))
1233
- return UTF16PtrToString (sddl )
1235
+
1236
+ var utf16s []uint16
1237
+ h := (* unsafeheader .Slice )(unsafe .Pointer (& utf16s ))
1238
+ h .Data = unsafe .Pointer (sddl )
1239
+ h .Len = int (strLen )
1240
+ h .Cap = int (strLen )
1241
+ return UTF16ToString (utf16s )
1234
1242
}
1235
1243
1236
1244
// ToAbsolute converts a self-relative security descriptor into an absolute one.
@@ -1308,9 +1316,14 @@ func (absoluteSD *SECURITY_DESCRIPTOR) ToSelfRelative() (selfRelativeSD *SECURIT
1308
1316
}
1309
1317
1310
1318
func (selfRelativeSD * SECURITY_DESCRIPTOR ) copySelfRelativeSecurityDescriptor () * SECURITY_DESCRIPTOR {
1311
- sdBytes := make ([]byte , selfRelativeSD .Length ())
1312
- copy (sdBytes , (* [(1 << 31 ) - 1 ]byte )(unsafe .Pointer (selfRelativeSD ))[:len (sdBytes ):len (sdBytes )])
1313
- return (* SECURITY_DESCRIPTOR )(unsafe .Pointer (& sdBytes [0 ]))
1319
+ var dst , src []byte
1320
+ dst = make ([]byte , selfRelativeSD .Length ())
1321
+ h := (* unsafeheader .Slice )(unsafe .Pointer (& src ))
1322
+ h .Data = unsafe .Pointer (selfRelativeSD )
1323
+ h .Len = len (dst )
1324
+ h .Cap = len (dst )
1325
+ copy (dst , src )
1326
+ return (* SECURITY_DESCRIPTOR )(unsafe .Pointer (& dst [0 ]))
1314
1327
}
1315
1328
1316
1329
// SecurityDescriptorFromString converts an SDDL string describing a security descriptor into a
Original file line number Diff line number Diff line change @@ -17,6 +17,7 @@ import (
17
17
"unicode/utf16"
18
18
"unsafe"
19
19
20
+ "golang.org/x/sys/internal/unsafeheader"
20
21
"golang.org/x/sys/windows"
21
22
)
22
23
@@ -201,7 +202,13 @@ func (m *Mgr) ListServices() ([]string, error) {
201
202
if servicesReturned == 0 {
202
203
return nil , nil
203
204
}
204
- services := (* [1 << 20 ]windows.ENUM_SERVICE_STATUS_PROCESS )(unsafe .Pointer (& buf [0 ]))[:servicesReturned :servicesReturned ]
205
+
206
+ var services []windows.ENUM_SERVICE_STATUS_PROCESS
207
+ hdr := (* unsafeheader .Slice )(unsafe .Pointer (& services ))
208
+ hdr .Data = unsafe .Pointer (& buf [0 ])
209
+ hdr .Len = int (servicesReturned )
210
+ hdr .Cap = int (servicesReturned )
211
+
205
212
var names []string
206
213
for _ , s := range services {
207
214
name := windows .UTF16PtrToString (s .ServiceName )
Original file line number Diff line number Diff line change @@ -12,6 +12,7 @@ import (
12
12
"time"
13
13
"unsafe"
14
14
15
+ "golang.org/x/sys/internal/unsafeheader"
15
16
"golang.org/x/sys/windows"
16
17
)
17
18
@@ -68,8 +69,13 @@ func (s *Service) RecoveryActions() ([]RecoveryAction, error) {
68
69
return nil , err
69
70
}
70
71
72
+ var actions []windows.SC_ACTION
73
+ hdr := (* unsafeheader .Slice )(unsafe .Pointer (& actions ))
74
+ hdr .Data = unsafe .Pointer (p .Actions )
75
+ hdr .Len = int (p .ActionsCount )
76
+ hdr .Cap = int (p .ActionsCount )
77
+
71
78
var recoveryActions []RecoveryAction
72
- actions := (* [1024 ]windows.SC_ACTION )(unsafe .Pointer (p .Actions ))[:p .ActionsCount :p .ActionsCount ]
73
79
for _ , action := range actions {
74
80
recoveryActions = append (recoveryActions , RecoveryAction {Type : int (action .Type ), Delay : time .Duration (action .Delay ) * time .Millisecond })
75
81
}
Original file line number Diff line number Diff line change @@ -14,6 +14,7 @@ import (
14
14
"syscall"
15
15
"unsafe"
16
16
17
+ "golang.org/x/sys/internal/unsafeheader"
17
18
"golang.org/x/sys/windows"
18
19
)
19
20
@@ -224,7 +225,13 @@ const (
224
225
func (s * service ) run () {
225
226
s .goWaits .Wait ()
226
227
s .h = windows .Handle (ssHandle )
227
- argv := (* [100 ]* uint16 )(unsafe .Pointer (sArgv ))[:sArgc :sArgc ]
228
+
229
+ var argv []* uint16
230
+ hdr := (* unsafeheader .Slice )(unsafe .Pointer (& argv ))
231
+ hdr .Data = unsafe .Pointer (sArgv )
232
+ hdr .Len = int (sArgc )
233
+ hdr .Cap = int (sArgc )
234
+
228
235
args := make ([]string , len (argv ))
229
236
for i , a := range argv {
230
237
args [i ] = windows .UTF16PtrToString (a )
Original file line number Diff line number Diff line change @@ -8,12 +8,13 @@ package windows
8
8
9
9
import (
10
10
errorspkg "errors"
11
- "strings"
12
11
"sync"
13
12
"syscall"
14
13
"time"
15
14
"unicode/utf16"
16
15
"unsafe"
16
+
17
+ "golang.org/x/sys/internal/unsafeheader"
17
18
)
18
19
19
20
type Handle uintptr
@@ -125,25 +126,19 @@ func UTF16PtrToString(p *uint16) string {
125
126
if p == nil {
126
127
return ""
127
128
}
128
-
129
- var sb strings.Builder
130
-
131
- for r := rune (* p ); r != 0 ; r = rune (* p ) {
132
- if ! utf16 .IsSurrogate (r ) {
133
- sb .WriteRune (r )
134
- } else {
135
- p = (* uint16 )(unsafe .Pointer (uintptr (unsafe .Pointer (p )) + unsafe .Sizeof (* p )))
136
- sb .WriteRune (utf16 .DecodeRune (r , rune (* p )))
137
-
138
- if * p == 0 {
139
- break
140
- }
141
- }
142
-
143
- p = (* uint16 )(unsafe .Pointer (uintptr (unsafe .Pointer (p )) + unsafe .Sizeof (* p )))
129
+ // Find NUL terminator.
130
+ n := 0
131
+ for ptr := unsafe .Pointer (p ); * (* uint16 )(ptr ) != 0 ; n ++ {
132
+ ptr = unsafe .Pointer (uintptr (ptr ) + unsafe .Sizeof (* p ))
144
133
}
145
134
146
- return sb .String ()
135
+ var s []uint16
136
+ h := (* unsafeheader .Slice )(unsafe .Pointer (& s ))
137
+ h .Data = unsafe .Pointer (p )
138
+ h .Len = n
139
+ h .Cap = n
140
+
141
+ return string (utf16 .Decode (s ))
147
142
}
148
143
149
144
func Getpagesize () int { return 4096 }
You can’t perform that action at this time.
0 commit comments