mirror of
https://github.com/rwinkhart/sys.git
synced 2026-08-30 05:46:45 -04:00
windows: correct NT definitions and add more resolution
Alex pointed out that some of these original types were incomplete, so this commit fills things out a bit more. We also add more to the test case. Change-Id: Iff7bd9ea6e0d021ba997c6d7351fe7c4a46187a9 Reviewed-on: https://go-review.googlesource.com/c/sys/+/299189 Trust: Jason A. Donenfeld <Jason@zx2c4.com> Run-TryBot: Jason A. Donenfeld <Jason@zx2c4.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
+40
-11
@@ -402,11 +402,12 @@ func NewCallbackCDecl(fn interface{}) uintptr {
|
|||||||
//sys rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) = ntdll.RtlGetVersion
|
//sys rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) = ntdll.RtlGetVersion
|
||||||
//sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers
|
//sys rtlGetNtVersionNumbers(majorVersion *uint32, minorVersion *uint32, buildNumber *uint32) = ntdll.RtlGetNtVersionNumbers
|
||||||
//sys RtlGetCurrentPeb() (peb *PEB) = ntdll.RtlGetCurrentPeb
|
//sys RtlGetCurrentPeb() (peb *PEB) = ntdll.RtlGetCurrentPeb
|
||||||
//sys RtlInitUnicodeString(destinationString *UNICODE_STRING, sourceString *uint16) = ntdll.RtlInitUnicodeString
|
//sys RtlInitUnicodeString(destinationString *NTUnicodeString, sourceString *uint16) = ntdll.RtlInitUnicodeString
|
||||||
|
//sys RtlInitString(destinationString *NTString, sourceString *byte) = ntdll.RtlInitString
|
||||||
//sys NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile
|
//sys NtCreateFile(handle *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, allocationSize *int64, attributes uint32, share uint32, disposition uint32, options uint32, eabuffer uintptr, ealength uint32) (ntstatus error) = ntdll.NtCreateFile
|
||||||
//sys NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile
|
//sys NtCreateNamedPipeFile(pipe *Handle, access uint32, oa *OBJECT_ATTRIBUTES, iosb *IO_STATUS_BLOCK, share uint32, disposition uint32, options uint32, typ uint32, readMode uint32, completionMode uint32, maxInstances uint32, inboundQuota uint32, outputQuota uint32, timeout *int64) (ntstatus error) = ntdll.NtCreateNamedPipeFile
|
||||||
//sys RtlDosPathNameToNtPathName(dosName *uint16, ntName *UNICODE_STRING, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus
|
//sys RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToNtPathName_U_WithStatus
|
||||||
//sys RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *UNICODE_STRING, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus
|
//sys RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) = ntdll.RtlDosPathNameToRelativeNtPathName_U_WithStatus
|
||||||
//sys RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl
|
//sys RtlDefaultNpAcl(acl **ACL) (ntstatus error) = ntdll.RtlDefaultNpAcl
|
||||||
//sys NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess
|
//sys NtQueryInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32, retLen *uint32) (ntstatus error) = ntdll.NtQueryInformationProcess
|
||||||
//sys NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess
|
//sys NtSetInformationProcess(proc Handle, procInfoClass int32, procInfo unsafe.Pointer, procInfoLen uint32) (ntstatus error) = ntdll.NtSetInformationProcess
|
||||||
@@ -1560,12 +1561,12 @@ func (s NTStatus) Error() string {
|
|||||||
return string(utf16.Decode(b[:n]))
|
return string(utf16.Decode(b[:n]))
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewUnicodeString returns a new UNICODE_STRING structure for use with native
|
// NewNTUnicodeString returns a new NTUnicodeString structure for use with native
|
||||||
// NT APIs that work over the UNICODE_STRING type. Note that most Windows APIs
|
// NT APIs that work over the NTUnicodeString type. Note that most Windows APIs
|
||||||
// do not use UNICODE_STRING, and instead UTF16PtrFromString should be used for
|
// do not use NTUnicodeString, and instead UTF16PtrFromString should be used for
|
||||||
// the more common *uint16 string type.
|
// the more common *uint16 string type.
|
||||||
func NewUnicodeString(s string) (*UNICODE_STRING, error) {
|
func NewNTUnicodeString(s string) (*NTUnicodeString, error) {
|
||||||
var u UNICODE_STRING
|
var u NTUnicodeString
|
||||||
s16, err := UTF16PtrFromString(s)
|
s16, err := UTF16PtrFromString(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -1574,8 +1575,8 @@ func NewUnicodeString(s string) (*UNICODE_STRING, error) {
|
|||||||
return &u, nil
|
return &u, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Slice returns a uint16 slice that aliases the data in the UNICODE_STRING.
|
// Slice returns a uint16 slice that aliases the data in the NTUnicodeString.
|
||||||
func (s *UNICODE_STRING) Slice() []uint16 {
|
func (s *NTUnicodeString) Slice() []uint16 {
|
||||||
var slice []uint16
|
var slice []uint16
|
||||||
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice))
|
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice))
|
||||||
hdr.Data = unsafe.Pointer(s.Buffer)
|
hdr.Data = unsafe.Pointer(s.Buffer)
|
||||||
@@ -1584,10 +1585,38 @@ func (s *UNICODE_STRING) Slice() []uint16 {
|
|||||||
return slice
|
return slice
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *UNICODE_STRING) String() string {
|
func (s *NTUnicodeString) String() string {
|
||||||
return UTF16ToString(s.Slice())
|
return UTF16ToString(s.Slice())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewNTString returns a new NTString structure for use with native
|
||||||
|
// NT APIs that work over the NTString type. Note that most Windows APIs
|
||||||
|
// do not use NTString, and instead UTF16PtrFromString should be used for
|
||||||
|
// the more common *uint16 string type.
|
||||||
|
func NewNTString(s string) (*NTString, error) {
|
||||||
|
var nts NTString
|
||||||
|
s8, err := BytePtrFromString(s)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
RtlInitString(&nts, s8)
|
||||||
|
return &nts, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Slice returns a byte slice that aliases the data in the NTString.
|
||||||
|
func (s *NTString) Slice() []byte {
|
||||||
|
var slice []byte
|
||||||
|
hdr := (*unsafeheader.Slice)(unsafe.Pointer(&slice))
|
||||||
|
hdr.Data = unsafe.Pointer(s.Buffer)
|
||||||
|
hdr.Len = int(s.Length)
|
||||||
|
hdr.Cap = int(s.MaximumLength)
|
||||||
|
return slice
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *NTString) String() string {
|
||||||
|
return ByteSliceToString(s.Slice())
|
||||||
|
}
|
||||||
|
|
||||||
// FindResource resolves a resource of the given name and resource type.
|
// FindResource resolves a resource of the given name and resource type.
|
||||||
func FindResource(module Handle, name, resType ResourceIDOrString) (Handle, error) {
|
func FindResource(module Handle, name, resType ResourceIDOrString) (Handle, error) {
|
||||||
var namePtr, resTypePtr uintptr
|
var namePtr, resTypePtr uintptr
|
||||||
|
|||||||
@@ -560,7 +560,20 @@ func TestPEBFilePath(t *testing.T) {
|
|||||||
}
|
}
|
||||||
pebPath := entry.FullDllName.String()
|
pebPath := entry.FullDllName.String()
|
||||||
if osPath != pebPath {
|
if osPath != pebPath {
|
||||||
t.Errorf("expected os.Executable() to return same value as peb.Ldr.{entry}.FullDllName - want %#q; got %#q", osPath, pebPath)
|
t.Errorf("peb.Ldr.{entry}.FullDllName = %#q; want %#q", pebPath, osPath)
|
||||||
|
}
|
||||||
|
paramPath := peb.ProcessParameters.ImagePathName.String()
|
||||||
|
if osPath != paramPath {
|
||||||
|
t.Errorf("peb.ProcessParameters.ImagePathName.{entry}.ImagePathName = %#q; want %#q", paramPath, osPath)
|
||||||
|
}
|
||||||
|
osCwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("unable to get working directory: %v", err)
|
||||||
|
}
|
||||||
|
osCwd = filepath.Clean(osCwd)
|
||||||
|
paramCwd := filepath.Clean(peb.ProcessParameters.CurrentDirectory.DosPath.String())
|
||||||
|
if paramCwd != osCwd {
|
||||||
|
t.Errorf("peb.ProcessParameters.CurrentDirectory.DosPath = %#q; want %#q", paramCwd, osCwd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2277,12 +2277,20 @@ type CommTimeouts struct {
|
|||||||
WriteTotalTimeoutConstant uint32
|
WriteTotalTimeoutConstant uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
type UNICODE_STRING struct {
|
// NTUnicodeString is a UTF-16 string for NT native APIs, corresponding to UNICODE_STRING.
|
||||||
|
type NTUnicodeString struct {
|
||||||
Length uint16
|
Length uint16
|
||||||
MaximumLength uint16
|
MaximumLength uint16
|
||||||
Buffer *uint16
|
Buffer *uint16
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NTString is an ANSI string for NT native APIs, corresponding to STRING.
|
||||||
|
type NTString struct {
|
||||||
|
Length uint16
|
||||||
|
MaximumLength uint16
|
||||||
|
Buffer *byte
|
||||||
|
}
|
||||||
|
|
||||||
type LIST_ENTRY struct {
|
type LIST_ENTRY struct {
|
||||||
Flink *LIST_ENTRY
|
Flink *LIST_ENTRY
|
||||||
Blink *LIST_ENTRY
|
Blink *LIST_ENTRY
|
||||||
@@ -2294,7 +2302,7 @@ type LDR_DATA_TABLE_ENTRY struct {
|
|||||||
reserved2 [2]uintptr
|
reserved2 [2]uintptr
|
||||||
DllBase uintptr
|
DllBase uintptr
|
||||||
reserved3 [2]uintptr
|
reserved3 [2]uintptr
|
||||||
FullDllName UNICODE_STRING
|
FullDllName NTUnicodeString
|
||||||
reserved4 [8]byte
|
reserved4 [8]byte
|
||||||
reserved5 [3]uintptr
|
reserved5 [3]uintptr
|
||||||
reserved6 uintptr
|
reserved6 uintptr
|
||||||
@@ -2307,6 +2315,51 @@ type PEB_LDR_DATA struct {
|
|||||||
InMemoryOrderModuleList LIST_ENTRY
|
InMemoryOrderModuleList LIST_ENTRY
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type CURDIR struct {
|
||||||
|
DosPath NTUnicodeString
|
||||||
|
Handle Handle
|
||||||
|
}
|
||||||
|
|
||||||
|
type RTL_DRIVE_LETTER_CURDIR struct {
|
||||||
|
Flags uint16
|
||||||
|
Length uint16
|
||||||
|
TimeStamp uint32
|
||||||
|
DosPath NTString
|
||||||
|
}
|
||||||
|
|
||||||
|
type RTL_USER_PROCESS_PARAMETERS struct {
|
||||||
|
MaximumLength, Length uint32
|
||||||
|
|
||||||
|
Flags, DebugFlags uint32
|
||||||
|
|
||||||
|
ConsoleHandle Handle
|
||||||
|
ConsoleFlags uint32
|
||||||
|
StandardInput, StandardOutput, StandardError Handle
|
||||||
|
|
||||||
|
CurrentDirectory CURDIR
|
||||||
|
DllPath NTUnicodeString
|
||||||
|
ImagePathName NTUnicodeString
|
||||||
|
CommandLine NTUnicodeString
|
||||||
|
Environment unsafe.Pointer
|
||||||
|
|
||||||
|
StartingX, StartingY, CountX, CountY, CountCharsX, CountCharsY, FillAttribute uint32
|
||||||
|
|
||||||
|
WindowFlags, ShowWindowFlags uint32
|
||||||
|
WindowTitle, DesktopInfo, ShellInfo, RuntimeData NTUnicodeString
|
||||||
|
CurrentDirectories [32]RTL_DRIVE_LETTER_CURDIR
|
||||||
|
|
||||||
|
EnvironmentSize, EnvironmentVersion uintptr
|
||||||
|
|
||||||
|
PackageDependencyData unsafe.Pointer
|
||||||
|
ProcessGroupId uint32
|
||||||
|
LoaderThreads uint32
|
||||||
|
|
||||||
|
RedirectionDllName NTUnicodeString
|
||||||
|
HeapPartitionName NTUnicodeString
|
||||||
|
DefaultThreadpoolCpuSetMasks uintptr
|
||||||
|
DefaultThreadpoolCpuSetMaskCount uint32
|
||||||
|
}
|
||||||
|
|
||||||
type PEB struct {
|
type PEB struct {
|
||||||
reserved1 [2]byte
|
reserved1 [2]byte
|
||||||
BeingDebugged byte
|
BeingDebugged byte
|
||||||
@@ -2314,7 +2367,7 @@ type PEB struct {
|
|||||||
reserved3 uintptr
|
reserved3 uintptr
|
||||||
ImageBaseAddress uintptr
|
ImageBaseAddress uintptr
|
||||||
Ldr *PEB_LDR_DATA
|
Ldr *PEB_LDR_DATA
|
||||||
ProcessParameters uintptr
|
ProcessParameters *RTL_USER_PROCESS_PARAMETERS
|
||||||
reserved4 [3]uintptr
|
reserved4 [3]uintptr
|
||||||
AtlThunkSListPtr uintptr
|
AtlThunkSListPtr uintptr
|
||||||
reserved5 uintptr
|
reserved5 uintptr
|
||||||
@@ -2333,7 +2386,7 @@ type PEB struct {
|
|||||||
type OBJECT_ATTRIBUTES struct {
|
type OBJECT_ATTRIBUTES struct {
|
||||||
Length uint32
|
Length uint32
|
||||||
RootDirectory Handle
|
RootDirectory Handle
|
||||||
ObjectName *UNICODE_STRING
|
ObjectName *NTUnicodeString
|
||||||
Attributes uint32
|
Attributes uint32
|
||||||
SecurityDescriptor *SECURITY_DESCRIPTOR
|
SecurityDescriptor *SECURITY_DESCRIPTOR
|
||||||
SecurityQoS *SECURITY_QUALITY_OF_SERVICE
|
SecurityQoS *SECURITY_QUALITY_OF_SERVICE
|
||||||
@@ -2365,7 +2418,7 @@ type RTLP_CURDIR_REF struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RTL_RELATIVE_NAME struct {
|
type RTL_RELATIVE_NAME struct {
|
||||||
RelativeName UNICODE_STRING
|
RelativeName NTUnicodeString
|
||||||
ContainingDirectory Handle
|
ContainingDirectory Handle
|
||||||
CurDirRef *RTLP_CURDIR_REF
|
CurDirRef *RTLP_CURDIR_REF
|
||||||
}
|
}
|
||||||
@@ -2470,7 +2523,7 @@ const (
|
|||||||
ProcessHandleTracing
|
ProcessHandleTracing
|
||||||
ProcessIoPriority
|
ProcessIoPriority
|
||||||
ProcessExecuteFlags
|
ProcessExecuteFlags
|
||||||
ProcessResourceManagement
|
ProcessTlsInformation
|
||||||
ProcessCookie
|
ProcessCookie
|
||||||
ProcessImageInformation
|
ProcessImageInformation
|
||||||
ProcessCycleTime
|
ProcessCycleTime
|
||||||
@@ -2545,8 +2598,8 @@ type PROCESS_BASIC_INFORMATION struct {
|
|||||||
PebBaseAddress *PEB
|
PebBaseAddress *PEB
|
||||||
AffinityMask uintptr
|
AffinityMask uintptr
|
||||||
BasePriority int32
|
BasePriority int32
|
||||||
UniqueProcessId Handle
|
UniqueProcessId uintptr
|
||||||
InheritedFromUniqueProcessId Handle
|
InheritedFromUniqueProcessId uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
// Constants for LocalAlloc flags.
|
// Constants for LocalAlloc flags.
|
||||||
|
|||||||
@@ -364,6 +364,7 @@ var (
|
|||||||
procRtlGetCurrentPeb = modntdll.NewProc("RtlGetCurrentPeb")
|
procRtlGetCurrentPeb = modntdll.NewProc("RtlGetCurrentPeb")
|
||||||
procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers")
|
procRtlGetNtVersionNumbers = modntdll.NewProc("RtlGetNtVersionNumbers")
|
||||||
procRtlGetVersion = modntdll.NewProc("RtlGetVersion")
|
procRtlGetVersion = modntdll.NewProc("RtlGetVersion")
|
||||||
|
procRtlInitString = modntdll.NewProc("RtlInitString")
|
||||||
procRtlInitUnicodeString = modntdll.NewProc("RtlInitUnicodeString")
|
procRtlInitUnicodeString = modntdll.NewProc("RtlInitUnicodeString")
|
||||||
procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb")
|
procRtlNtStatusToDosErrorNoTeb = modntdll.NewProc("RtlNtStatusToDosErrorNoTeb")
|
||||||
procCLSIDFromString = modole32.NewProc("CLSIDFromString")
|
procCLSIDFromString = modole32.NewProc("CLSIDFromString")
|
||||||
@@ -3096,7 +3097,7 @@ func RtlDefaultNpAcl(acl **ACL) (ntstatus error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RtlDosPathNameToNtPathName(dosName *uint16, ntName *UNICODE_STRING, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) {
|
func RtlDosPathNameToNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) {
|
||||||
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U_WithStatus.Addr(), 4, uintptr(unsafe.Pointer(dosName)), uintptr(unsafe.Pointer(ntName)), uintptr(unsafe.Pointer(ntFileNamePart)), uintptr(unsafe.Pointer(relativeName)), 0, 0)
|
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToNtPathName_U_WithStatus.Addr(), 4, uintptr(unsafe.Pointer(dosName)), uintptr(unsafe.Pointer(ntName)), uintptr(unsafe.Pointer(ntFileNamePart)), uintptr(unsafe.Pointer(relativeName)), 0, 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
ntstatus = NTStatus(r0)
|
ntstatus = NTStatus(r0)
|
||||||
@@ -3104,7 +3105,7 @@ func RtlDosPathNameToNtPathName(dosName *uint16, ntName *UNICODE_STRING, ntFileN
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *UNICODE_STRING, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) {
|
func RtlDosPathNameToRelativeNtPathName(dosName *uint16, ntName *NTUnicodeString, ntFileNamePart *uint16, relativeName *RTL_RELATIVE_NAME) (ntstatus error) {
|
||||||
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToRelativeNtPathName_U_WithStatus.Addr(), 4, uintptr(unsafe.Pointer(dosName)), uintptr(unsafe.Pointer(ntName)), uintptr(unsafe.Pointer(ntFileNamePart)), uintptr(unsafe.Pointer(relativeName)), 0, 0)
|
r0, _, _ := syscall.Syscall6(procRtlDosPathNameToRelativeNtPathName_U_WithStatus.Addr(), 4, uintptr(unsafe.Pointer(dosName)), uintptr(unsafe.Pointer(ntName)), uintptr(unsafe.Pointer(ntFileNamePart)), uintptr(unsafe.Pointer(relativeName)), 0, 0)
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
ntstatus = NTStatus(r0)
|
ntstatus = NTStatus(r0)
|
||||||
@@ -3131,7 +3132,12 @@ func rtlGetVersion(info *OsVersionInfoEx) (ntstatus error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func RtlInitUnicodeString(destinationString *UNICODE_STRING, sourceString *uint16) {
|
func RtlInitString(destinationString *NTString, sourceString *byte) {
|
||||||
|
syscall.Syscall(procRtlInitString.Addr(), 2, uintptr(unsafe.Pointer(destinationString)), uintptr(unsafe.Pointer(sourceString)), 0)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func RtlInitUnicodeString(destinationString *NTUnicodeString, sourceString *uint16) {
|
||||||
syscall.Syscall(procRtlInitUnicodeString.Addr(), 2, uintptr(unsafe.Pointer(destinationString)), uintptr(unsafe.Pointer(sourceString)), 0)
|
syscall.Syscall(procRtlInitUnicodeString.Addr(), 2, uintptr(unsafe.Pointer(destinationString)), uintptr(unsafe.Pointer(sourceString)), 0)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user