From 8e4b87b1c7a033dceb97c0201b0c2085809094e6 Mon Sep 17 00:00:00 2001 From: Nick Maliwacki Date: Wed, 6 Nov 2019 20:50:34 -0800 Subject: [PATCH] Remove cGo and use syscall (lose static types) (#7) fixes https://github.com/KnicKnic/go-powershell/issues/6 --- azure-pipelines.yml | 1 - bin/host.h | 3 + bin/psh_host.dll | Bin 184832 -> 186880 bytes go.mod | 2 +- go.sum | 2 + native-powershell | 2 +- pkg/powershell/chelpers.go | 180 +++++------------------- pkg/powershell/higherops_test.go | 4 +- pkg/powershell/hostcommand.go | 58 ++++---- pkg/powershell/powershell.cpp | 164 ---------------------- pkg/powershell/powershell.go | 67 ++++----- pkg/powershell/powershell.h | 29 ---- pkg/powershell/powershellobjects.go | 50 ++----- pkg/powershell/psh_host.go | 95 +++++++++++++ pkg/powershell/readme.md | 6 + pkg/powershell/runspace.go | 38 ++--- pkg/powershell/runspacehelpers.go | 158 +++++++++++++++++++++ pkg/powershell/zpsh_host.go | 207 ++++++++++++++++++++++++++++ readme.md | 14 +- 19 files changed, 594 insertions(+), 486 deletions(-) delete mode 100644 pkg/powershell/powershell.cpp delete mode 100644 pkg/powershell/powershell.h create mode 100644 pkg/powershell/psh_host.go create mode 100644 pkg/powershell/readme.md create mode 100644 pkg/powershell/runspacehelpers.go create mode 100644 pkg/powershell/zpsh_host.go diff --git a/azure-pipelines.yml b/azure-pipelines.yml index df0331f..8da9071 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -39,7 +39,6 @@ steps: inputs: targetType: 'inline' script: 'choco install -y golang --no-progress; - choco install -y mingw --no-progress; refreshenv ; copy native-powershell\host.h .\pkg\powershell\ ; copy native-powershell\x64\Release\psh_host.dll . ; diff --git a/bin/host.h b/bin/host.h index 644d2db..5ff08ee 100644 --- a/bin/host.h +++ b/bin/host.h @@ -34,6 +34,9 @@ extern "C" { }NativePowerShell_LogString_Holder, * PNativePowerShell_LogString_Holder; void NativePowerShell_InitLibrary( NativePowerShell_AllocPointer, NativePowerShell_FreePointer); + + unsigned char* NativePowerShell_DefaultAlloc(unsigned long long size); + void NativePowerShell_DefaultFree(void* address); //typedef struct NativePowerShell_RunspaceHandle_ {} *NativePowerShell_RunspaceHandle; // typedef struct NativePowerShell_PowerShellHandle_ {} *NativePowerShell_PowerShellHandle; diff --git a/bin/psh_host.dll b/bin/psh_host.dll index f75ef4af383e563391e9a90d3d7127371993e9ac..499d0b9c8f1753cb30873b9a086c16d13d56a19d 100644 GIT binary patch literal 186880 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 K-~Z2Y;Qs^YfdAA0 diff --git a/go.mod b/go.mod index 0e880ab..e3c694c 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,6 @@ go 1.12 require ( github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b - golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb + golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 k8s.io/klog v1.0.0 ) diff --git a/go.sum b/go.sum index b81d8bc..7425fd8 100644 --- a/go.sum +++ b/go.sum @@ -3,5 +3,7 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekf github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k= golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 h1:ZJUmhYTp8GbGC0ViZRc2U+MIYQ8xx9MscsdXnclfIhw= +golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= diff --git a/native-powershell b/native-powershell index 60ee25e..49419e0 160000 --- a/native-powershell +++ b/native-powershell @@ -1 +1 @@ -Subproject commit 60ee25e186f8c704d7be99aba3c2cc1ce04827dd +Subproject commit 49419e083381ced660038977496a1ec0a172a371 diff --git a/pkg/powershell/chelpers.go b/pkg/powershell/chelpers.go index b6272d1..806aea4 100644 --- a/pkg/powershell/chelpers.go +++ b/pkg/powershell/chelpers.go @@ -6,171 +6,57 @@ import ( "golang.org/x/sys/windows" ) -/* - -#cgo CFLAGS: -I. -#cgo LDFLAGS: -static ${SRCDIR}/../../bin/psh_host.dll - - -#include -#include -#include "powershell.h" - -*/ -import "C" - -func makeString(str *C.wchar_t) string { - ptr := unsafe.Pointer(str) - count := C.wcslen(str) + 1 - arr := make([]uint16, count) - ptrwchar := unsafe.Pointer(&arr[0]) - - C.memcpy(ptrwchar, ptr, count*2) - - s := windows.UTF16ToString(arr) - return s -} - -func makeCString(str string) *C.wchar_t { - cs, _ := windows.UTF16PtrFromString(str) - ptrwchar := unsafe.Pointer(cs) - return C.MallocCopy((*C.wchar_t)(ptrwchar)) -} - -//export logWchart -// logWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Write(s) - } -} - -//export logWarningWchart -// logWarningWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logWarningWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Warning(s) - } +func makeUint64FromPtr(v uintptr) uint64 { + return *((*uint64)(unsafe.Pointer(&v))) } - -//export logInformationWchart -// logInformationWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logInformationWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Information(s) - } +func makeUintptrFromUint64(v uint64) uintptr { + return *((*uintptr)(unsafe.Pointer(&v))) } -//export logVerboseWchart -// logVerboseWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logVerboseWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Verbose(s) - } +func allocWrapper(size uint64) uintptr { + return nativePowerShell_DefaultAlloc(size) } - -//export logDebugWchart -// logDebugWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logDebugWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Debug(s) - } +func freeWrapper(v uintptr) { + nativePowerShell_DefaultFree(v) } -//export logErrorWchart -// logErrorWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logErrorWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Error(s) - } -} +func mallocCopy(input uintptr, size uintptr) uintptr { + u64Size := makeUint64FromPtr(size) + data := allocWrapper(u64Size) + _ = memcpy(data, uintptr(unsafe.Pointer(input)), u64Size) -//export loglnWchart -// loglnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func loglnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Writeln(s) - } + return data } -//export logWarninglnWchart -// logWarninglnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logWarninglnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Warningln(s) +func wsclen(str uintptr) uint64 { + var charCode uint16 = 1 + var i uint64 = 0 + for ; charCode != 0; i++ { + charCode = *(*uint16)(unsafe.Pointer(str + (makeUintptrFromUint64(i) * unsafe.Sizeof(charCode)))) } + return i } -//export logInformationlnWchart -// logInformationlnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logInformationlnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Informationln(s) - } -} +func makeString(str uintptr) string { + count := wsclen(str) + 1 + arr := make([]uint16, count) + ptrwchar := unsafe.Pointer(&arr[0]) -//export logVerboselnWchart -// logVerboselnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logVerboselnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Verboseln(s) - } -} + memcpy(uintptr(ptrwchar), str, count*2) -//export logDebuglnWchart -// logDebuglnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logDebuglnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Debugln(s) - } + s := windows.UTF16ToString(arr) + return s } -//export logErrorlnWchart -// logErrorlnWchart the C function pointer that dispatches to the Golang function for SimpleLogging -func logErrorlnWchart(context uint64, str *C.wchar_t) { - if context != 0 { - s := makeString(str) - contextInterface := getRunspaceContext(context) - contextInterface.log.Errorln(s) - } +func uintptrMakeString(ptr uintptr) string { + return makeString(ptr) } -//export commandWchart -// commandWchart the C function pointer that dispatches to the Golang function for Send-HostCommand -func commandWchart(context uint64, cMessage *C.wchar_t, input *C.NativePowerShell_PowerShellObject, inputCount uint64, ret *C.NativePowerShell_JsonReturnValues) { +func makeCStringUintptr(str string) uintptr { + cs, _ := windows.UTF16PtrFromString(str) + ptrwchar := unsafe.Pointer(cs) + size := 2 * (wsclen(uintptr(ptrwchar)) + 1) - var resultsWriter callbackResultsWriter - if context != 0 { - contextInterface := getRunspaceContext(context) - inputArr := make([]Object, inputCount) - for i := uint32(0); uint64(i) < inputCount; i++ { - inputArr[i] = makePowerShellObjectIndexed(input, i) - } - message := makeString(cMessage) - contextInterface.callback.Callback(contextInterface.recreateRunspace(), message, inputArr, &resultsWriter) - } - resultsWriter.filloutResults(ret) + return mallocCopy(uintptr(ptrwchar), makeUintptrFromUint64(size)) } diff --git a/pkg/powershell/higherops_test.go b/pkg/powershell/higherops_test.go index 6473374..b64848a 100644 --- a/pkg/powershell/higherops_test.go +++ b/pkg/powershell/higherops_test.go @@ -508,7 +508,7 @@ func TestCpowershellJsonMarshal(t *testing.T) { } func TestClogWchart_lookupFail(t *testing.T) { - cStr := makeCString("test String") + cStr := makeCStringUintptr("test String") caughtFailedToLoad := false defer func() { if r := recover(); r != nil { @@ -517,7 +517,7 @@ func TestClogWchart_lookupFail(t *testing.T) { caughtFailedToLoad = true } }() - logWchart(1, cStr) + loggerCallbackDebugln(1, cStr) if !caughtFailedToLoad { t.Fail() } diff --git a/pkg/powershell/hostcommand.go b/pkg/powershell/hostcommand.go index c6ee9a5..cd5d6b6 100644 --- a/pkg/powershell/hostcommand.go +++ b/pkg/powershell/hostcommand.go @@ -1,16 +1,6 @@ package powershell -/* - -#cgo CFLAGS: -I. -#cgo LDFLAGS: -static ${SRCDIR}/../../bin/psh_host.dll - - -#include -#include "powershell.h" - -*/ -import "C" +import "unsafe" // CallbackResultsWriter allows you to write values to powershell when inside Send-HostCommand type CallbackResultsWriter interface { @@ -35,34 +25,52 @@ func (callback CallbackFuncPtr) Callback(runspace Runspace, message string, inpu // callbackResultsWriter is the internal implementation of CallbackResultsWriter type callbackResultsWriter struct { - objects []C.NativePowerShell_GenericPowerShellObject + objects []nativePowerShell_GenericPowerShellObject +} + +func setGenericPowershellString(object *nativePowerShell_GenericPowerShellObject, value uintptr, autoRelease byte) { + object.typeEnum = nativePowerShell_PowerShellObjectTypeString + object.object = makeUint64FromPtr(value) + object.releaseObject = autoRelease +} + +func setGenericPowerShellHandle(object *nativePowerShell_GenericPowerShellObject, value nativePowerShell_PowerShellObject, autoRelease byte) { + object.typeEnum = nativePowerShell_PowerShellObjectHandle + object.object = value + object.releaseObject = autoRelease } // WriteString accumulates a string object to return from Send-HostCommand func (writer *callbackResultsWriter) WriteString(str string) { - cStr := makeCString(str) - var obj C.NativePowerShell_GenericPowerShellObject - C.SetGenericPowershellString(&obj, cStr, 1) + cStr := makeCStringUintptr(str) + var obj nativePowerShell_GenericPowerShellObject + setGenericPowershellString(&obj, cStr, 1) writer.objects = append(writer.objects, obj) } // Write accumulates a string object to return from Send-HostCommand func (writer *callbackResultsWriter) Write(handle Object, needsClose bool) { - var obj C.NativePowerShell_GenericPowerShellObject - var autoClose C.char - if needsClose { - autoClose = 1 - } - C.SetGenericPowerShellHandle(&obj, handle.toCHandle(), autoClose) + var obj nativePowerShell_GenericPowerShellObject + var autoClose = boolToByte(needsClose) + + setGenericPowerShellHandle(&obj, handle.toCHandle(), autoClose) writer.objects = append(writer.objects, obj) } +func mallocCopyGenericPowerShellObject(input *nativePowerShell_GenericPowerShellObject, inputCount uint64) *nativePowerShell_GenericPowerShellObject { + + size := uintptr(inputCount) * unsafe.Sizeof(*input) + + return (*nativePowerShell_GenericPowerShellObject)(unsafe.Pointer(mallocCopy(uintptr(unsafe.Pointer(input)), size))) +} + // filloutResults takes accumulated objects from Write calls and prepares them to cross the C boundary -func (writer *callbackResultsWriter) filloutResults(results *C.NativePowerShell_JsonReturnValues) { +func (writer *callbackResultsWriter) filloutResults(res uintptr) { + results := (*nativePowerShell_JsonReturnValues)(unsafe.Pointer(res)) results.objects = nil results.count = 0 - if writer.objects != nil { - results.count = C.ulong(len(writer.objects)) - results.objects = C.MallocCopyGenericPowerShellObject(&writer.objects[0], C.ulonglong(len(writer.objects))) + if writer.objects != nil && len(writer.objects) > 0 { + results.count = uint32(len(writer.objects)) + results.objects = mallocCopyGenericPowerShellObject(&writer.objects[0], uint64(len(writer.objects))) } } diff --git a/pkg/powershell/powershell.cpp b/pkg/powershell/powershell.cpp deleted file mode 100644 index ef33de1..0000000 --- a/pkg/powershell/powershell.cpp +++ /dev/null @@ -1,164 +0,0 @@ -#include -#include "powershell.h" -#include "./../../bin/host.h" - -#include -#include -#include "sys/types.h" -#include "_cgo_export.h" - -#include - - - unsigned char *MallocWrapper(unsigned long long size) - { - auto ptr = (unsigned char *)malloc(size); - if (ptr == nullptr) - { - throw "memory alloc returned nullptr"; - } - return ptr; - } -void FreeWrapper(void *ptr) -{ - return free(ptr); - } - -void InitLibraryHelper(){ - NativePowerShell_InitLibrary(MallocWrapper, free); -} - -void * MallocCopyGeneric(const void * input, unsigned long long byteCount ){ - if(input == nullptr){ - return nullptr; - } - void* dest = MallocWrapper(byteCount); - memcpy(dest, input, byteCount); - return dest; -} - -NativePowerShell_GenericPowerShellObject * MallocCopyGenericPowerShellObject(NativePowerShell_GenericPowerShellObject* input, unsigned long long inputCount){ - return (NativePowerShell_GenericPowerShellObject *)MallocCopyGeneric(input, inputCount * sizeof(input[0])); -} - -const wchar_t* MallocCopy(const wchar_t* str) -{ - if (str == NULL) - return NULL; - - size_t s = wcslen(str) + 1; - return (const wchar_t *)MallocCopyGeneric(str, s * sizeof(str[0])); -} - - void Logger(void *context, const wchar_t* s) - { - logWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void Loggerln(void *context, const wchar_t* s) - { - loglnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerDebug(void *context, const wchar_t* s) - { - logDebugWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerDebugln(void *context, const wchar_t* s) - { - logDebuglnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerVerbose(void *context, const wchar_t* s) - { - logVerboseWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerVerboseln(void *context, const wchar_t* s) - { - logVerboselnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerInformation(void *context, const wchar_t* s) - { - logInformationWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerInformationln(void *context, const wchar_t* s) - { - logInformationlnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerWarning(void *context, const wchar_t* s) - { - logWarningWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerWarningln(void *context, const wchar_t* s) - { - logWarninglnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerError(void *context, const wchar_t* s) - { - logErrorWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - void LoggerErrorln(void *context, const wchar_t* s) - { - logErrorlnWchart((unsigned long long )context, (wchar_t *)s); - //printf("My Member Logger: %ws\n", s); - } - -NativePowerShell_LogString_Holder LoggerDispatcher = { - Logger, - LoggerError, - LoggerWarning, - LoggerInformation, - LoggerVerbose, - LoggerDebug, - Loggerln, - LoggerErrorln, - LoggerWarningln, - LoggerInformationln, - LoggerVerboseln, - LoggerDebugln - }; - void Command(void *context, const wchar_t* s, NativePowerShell_PowerShellObject* input, unsigned long long inputCount, NativePowerShell_JsonReturnValues * returnValues) - { - commandWchart((unsigned long long) context, (wchar_t *)s, input, inputCount, returnValues); - } - -NativePowerShell_RunspaceHandle CreateRunspaceHelper(unsigned long long context, char useLogger, char useCommand ){ - PNativePowerShell_LogString_Holder loggerPtr = &LoggerDispatcher; - NativePowerShell_ReceiveJsonCommand commandPtr = Command; - if(useLogger == 0){ - loggerPtr = nullptr; - } - if(useCommand == 0){ - commandPtr = nullptr; - } - return NativePowerShell_CreateRunspace((void*)context, commandPtr, loggerPtr); -} - -NativePowerShell_RunspaceHandle CreateRemoteRunspaceHelper(unsigned long long context, char useLogger, const wchar_t * remoteMachine, const wchar_t * userName, const wchar_t * password ){ - PNativePowerShell_LogString_Holder loggerPtr = &LoggerDispatcher; - if(useLogger == 0){ - loggerPtr = nullptr; - } - return NativePowerShell_CreateRemoteRunspace((void*)context, loggerPtr, remoteMachine, userName, password); -} - - -void SetGenericPowershellString(NativePowerShell_GenericPowerShellObject* object, wchar_t *value, char autoRelease){ - object->type = NativePowerShell_PowerShellObjectTypeString; - object->instance.string = value; - object->releaseObject = autoRelease; -} - -void SetGenericPowerShellHandle(NativePowerShell_GenericPowerShellObject* object, NativePowerShell_PowerShellObject value,char autoRelease){ - object->type = NativePowerShell_PowerShellObjectHandle; - object->instance.psObject = value; - object->releaseObject = autoRelease; -} \ No newline at end of file diff --git a/pkg/powershell/powershell.go b/pkg/powershell/powershell.go index 7e0817a..d6cbd08 100644 --- a/pkg/powershell/powershell.go +++ b/pkg/powershell/powershell.go @@ -6,21 +6,9 @@ import ( "golang.org/x/sys/windows" ) -/* - -#cgo CFLAGS: -I. -#cgo LDFLAGS: -static ${SRCDIR}/../../bin/psh_host.dll - - -#include -#include "powershell.h" - -*/ -import "C" - // psCommand represents a powershell command, must call Close type psCommand struct { - handle C.NativePowerShell_PowerShellHandle + handle nativePowerShell_PowerShellHandle context *runspaceContext } @@ -38,21 +26,23 @@ func (runspace Runspace) createCommand() psCommand { currentCommand := currentlyInvoking[len(currentlyInvoking)-1] return currentCommand.createNested() } - return psCommand{C.NativePowerShell_CreatePowerShell(runspace.handle), runspace.runspaceContext} + handle := nativePowerShell_CreatePowerShell(runspace.handle) + + return psCommand{handle, runspace.runspaceContext} } // createNested a nested powershell command func (command psCommand) createNested() psCommand { - return psCommand{C.NativePowerShell_CreatePowerShellNested(command.handle), command.context} + return psCommand{nativePowerShell_CreatePowerShellNested(command.handle), command.context} } // Close and free a psCommand // , call on all objects even those that are Invoked func (command psCommand) Close() { - C.NativePowerShell_DeletePowershell(command.handle) + nativePowerShell_DeletePowershell(command.handle) } -func boolToCChar(b bool) C.char { +func boolToByte(b bool) byte { if b { return 1 } @@ -63,53 +53,46 @@ func boolToCChar(b bool) C.char { func (command psCommand) AddCommand(commandlet string, useLocalScope bool) { cs, _ := windows.UTF16PtrFromString(commandlet) - ptrwchar := unsafe.Pointer(cs) - localScope := boolToCChar(useLocalScope) + localScope := boolToByte(useLocalScope) - _ = C.NativePowerShell_AddCommandSpecifyScope(command.handle, (*C.wchar_t)(ptrwchar), localScope) + _ = nativePowerShell_AddCommandSpecifyScope(command.handle, cs, localScope) } // AddScript to an existing powershell command func (command psCommand) AddScript(script string, useLocalScope bool) { cs, _ := windows.UTF16PtrFromString(script) - ptrwchar := unsafe.Pointer(cs) - localScope := boolToCChar(useLocalScope) + localScope := boolToByte(useLocalScope) - _ = C.NativePowerShell_AddScriptSpecifyScope(command.handle, (*C.wchar_t)(ptrwchar), localScope) + _ = nativePowerShell_AddScriptSpecifyScope(command.handle, cs, localScope) } // AddArgumentString add a string argument to an existing powershell command func (command psCommand) AddArgumentString(argument string) { cs, _ := windows.UTF16PtrFromString(argument) - ptrwchar := unsafe.Pointer(cs) - - _ = C.NativePowerShell_AddArgument(command.handle, (*C.wchar_t)(ptrwchar)) + _ = nativePowerShell_AddArgument(command.handle, cs) } // AddArgument add a Object argument to an existing powershell command func (command psCommand) AddArgument(object Object) { - _ = C.NativePowerShell_AddPSObjectArgument(command.handle, object.handle) + _ = nativePowerShell_AddPSObjectArgument(command.handle, object.handle) } // AddParameterString add a string with a parameter name to an existing powershell command func (command psCommand) AddParameterString(paramName string, paramValue string) { cName, _ := windows.UTF16PtrFromString(paramName) - ptrName := unsafe.Pointer(cName) cValue, _ := windows.UTF16PtrFromString(paramValue) - ptrValue := unsafe.Pointer(cValue) - _ = C.NativePowerShell_AddParameterString(command.handle, (*C.wchar_t)(ptrName), (*C.wchar_t)(ptrValue)) + _ = nativePowerShell_AddParameterString(command.handle, cName, cValue) } // AddParameter add a Object with a parameter name to an existing powershell command func (command psCommand) AddParameter(paramName string, object Object) { cName, _ := windows.UTF16PtrFromString(paramName) - ptrName := unsafe.Pointer(cName) - _ = C.NativePowerShell_AddParameterObject(command.handle, (*C.wchar_t)(ptrName), object.handle) + _ = nativePowerShell_AddParameterObject(command.handle, cName, object.handle) } func (command psCommand) completeInvoke() { @@ -123,29 +106,31 @@ func (command psCommand) completeInvoke() { // Must still call Close on this object func (command psCommand) Invoke() *InvokeResults { - var objects *C.NativePowerShell_PowerShellObject - var count C.uint + var objects uintptr + var count uint command.context.invoking = append(command.context.invoking, command) defer command.completeInvoke() - exception := C.NativePowerShell_InvokeCommand(command.handle, &objects, &count) + exception := nativePowerShell_InvokeCommand(command.handle, &objects, &count) return makeInvokeResults(objects, count, exception) } -func makePowerShellObjectIndexed(objects *C.NativePowerShell_PowerShellObject, index uint32) Object { +func makePowerShellObjectIndexed(objects uintptr, index uint32) Object { // I don't get why I have to use unsafe.Pointer on C memory + var handle nativePowerShell_PowerShellObject + ptr := unsafe.Pointer(objects) - offset := (uintptr(index) * unsafe.Sizeof(*objects)) - var obj C.NativePowerShell_PowerShellObject = *(*C.NativePowerShell_PowerShellObject)(unsafe.Pointer(uintptr(ptr) + offset)) - return makePowerShellObject(obj) + offset := (uintptr(index) * unsafe.Sizeof(handle)) + handle = *(*nativePowerShell_PowerShellObject)(unsafe.Pointer(uintptr(ptr) + offset)) + return makePowerShellObject(handle) } -func makePowerShellObject(object C.NativePowerShell_PowerShellObject) Object { +func makePowerShellObject(object nativePowerShell_PowerShellObject) Object { // var obj uint64 = *(*uint64)(unsafe.Pointer(&object)) // return Object{obj} return Object{object} } -func makeInvokeResults(objects *C.NativePowerShell_PowerShellObject, count C.uint, exception C.NativePowerShell_PowerShellObject) *InvokeResults { +func makeInvokeResults(objects uintptr, count uint, exception nativePowerShell_PowerShellObject) *InvokeResults { results := InvokeResults{Objects: make([]Object, count), Exception: makePowerShellObject(exception), objectsNoClose: make(map[int]bool), diff --git a/pkg/powershell/powershell.h b/pkg/powershell/powershell.h deleted file mode 100644 index 470bc1f..0000000 --- a/pkg/powershell/powershell.h +++ /dev/null @@ -1,29 +0,0 @@ - -#include "./../../bin/host.h" -#include -#ifdef __cplusplus -extern "C" { -#endif - - -wchar_t GetChar(wchar_t *t, int offset); - - unsigned char* MallocWrapper(unsigned long long size); - void FreeWrapper(void *); - -void InitLibraryHelper(); - -NativePowerShell_GenericPowerShellObject * MallocCopyGenericPowerShellObject(NativePowerShell_GenericPowerShellObject* input, unsigned long long inputCount); -const wchar_t* MallocCopy(const wchar_t* str); - - void Logger(const wchar_t* s); - -NativePowerShell_RunspaceHandle CreateRunspaceHelper(unsigned long long, char useLogger, char useCommand); -NativePowerShell_RunspaceHandle CreateRemoteRunspaceHelper(unsigned long long context, char useLogger, const wchar_t * remoteMachine, const wchar_t * userName, const wchar_t * password ); - -void SetGenericPowershellString(NativePowerShell_GenericPowerShellObject* object, wchar_t *value,char autoRelease); -void SetGenericPowerShellHandle(NativePowerShell_GenericPowerShellObject* object, NativePowerShell_PowerShellObject handle,char autoRelease); - -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/pkg/powershell/powershellobjects.go b/pkg/powershell/powershellobjects.go index f3d4b36..98aa700 100644 --- a/pkg/powershell/powershellobjects.go +++ b/pkg/powershell/powershellobjects.go @@ -1,18 +1,8 @@ package powershell -/* - -#cgo CFLAGS: -I. -#cgo LDFLAGS: -static ${SRCDIR}/../../bin/psh_host.dll - - -#include -#include "powershell.h" - -*/ -import "C" -import "unsafe" -import "encoding/json" +import ( + "encoding/json" +) // Object representing an object return from a powershell invocation // @@ -20,24 +10,14 @@ import "encoding/json" // // See note on Object.Close for exceptions & more rules about Close type Object struct { - handle C.NativePowerShell_PowerShellObject + handle nativePowerShell_PowerShellObject } // toCHandle gets the backing handle of Object -func (obj Object) toCHandle() C.NativePowerShell_PowerShellObject { - // return *((*C.NativePowerShell_PowerShellObject)(unsafe.Pointer(&obj.handle))) +func (obj Object) toCHandle() nativePowerShell_PowerShellObject { return obj.handle } -// // toCHandle gets the backing handle of Object -// func makeCHandles(objects []Object) []C.NativePowerShell_PowerShellObject { -// cHandles := make([]C.NativePowerShell_PowerShellObject, len(objects)) -// for i,object := range(objects){ -// cHandles[i] = object.handle -// } -// return cHandles -// } - // Close allows the memory for the powershell object to be reclaimed // // Should be called on all objects returned from a powershell invocation (not callback parameters) @@ -46,21 +26,21 @@ func (obj Object) toCHandle() C.NativePowerShell_PowerShellObject { // // Needs to be called for every object returned from AddRef func (obj Object) Close() { - C.NativePowerShell_ClosePowerShellObject(obj.toCHandle()) + nativePowerShell_ClosePowerShellObject(obj.toCHandle()) } // AddRef returns a new Object that has to also be called Close on // -// This is useful in Callback processing, as those NativePowerShell_PowerShellObjects are auto closed, and to keep +// This is useful in Callback processing, as those nativePowerShell_PowerShellObjects are auto closed, and to keep // a reference after the function returns use AddRef func (obj Object) AddRef() Object { - handle := C.NativePowerShell_AddPSObjectHandle(obj.toCHandle()) + handle := nativePowerShell_AddPSObjectHandle(obj.toCHandle()) return makePowerShellObject(handle) } // IsNull returns true if the backing powershell object is null func (obj Object) IsNull() bool { - return C.NativePowerShell_IsPSObjectNullptr(obj.toCHandle()) == 1 + return nativePowerShell_IsPSObjectNullptr(obj.toCHandle()) == 1 } // Type returns the (System.Object).GetType().ToString() function @@ -71,9 +51,9 @@ func (obj Object) Type() string { return "nullptr" } - var str *C.wchar_t = C.NativePowerShell_GetPSObjectType(obj.toCHandle()) - defer C.FreeWrapper(unsafe.Pointer(str)) - return makeString(str) + str := nativePowerShell_GetPSObjectType(obj.toCHandle()) + defer freeWrapper(str) + return uintptrMakeString(str) } // ToString returns the (System.Object).ToString() function @@ -84,9 +64,9 @@ func (obj Object) ToString() string { return "nullptr" } - var str *C.wchar_t = C.NativePowerShell_GetPSObjectToString(obj.toCHandle()) - defer C.FreeWrapper(unsafe.Pointer(str)) - return makeString(str) + str := nativePowerShell_GetPSObjectToString(obj.toCHandle()) + defer freeWrapper(str) + return uintptrMakeString(str) } // JSONUnmarshal calls the ToString function and unmarshals it into the supplied object diff --git a/pkg/powershell/psh_host.go b/pkg/powershell/psh_host.go new file mode 100644 index 0000000..3342566 --- /dev/null +++ b/pkg/powershell/psh_host.go @@ -0,0 +1,95 @@ +package powershell + +//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zpsh_host.go psh_host.go + +//https://stackoverflow.com/questions/35154074/how-do-i-manage-windows-user-accounts-in-go +// copy ~\go\src\golang.org\x\sys\windows\mksyscall.go . + +const ( + nativePowerShell_InvalidHandleValue = 0 + nativePowerShell_InvalidPointer = uintptr(0) +) + +type ( + nativePowerShell_StringPtr = *uint16 + nativePowerShell_LogString func(context uintptr, messages nativePowerShell_StringPtr) uintptr + nativePowerShell_LogString_Holder struct { + Log uintptr + LogError uintptr + LogWarning uintptr + LogInformation uintptr + LogVerbose uintptr + LogDebug uintptr + LogLine uintptr + LogErrorLine uintptr + LogWarningLine uintptr + LogInformationLine uintptr + LogVerboseLine uintptr + LogDebugLine uintptr + } + nativePowerShell_RunspaceHandle = uint64 + nativePowerShell_PowerShellHandle = uint64 + nativePowerShell_PowerShellObject = uint64 + nativePowerShell_PowerShellObjectType = uint32 +) + +const ( + nativePowerShell_PowerShellObjectTypeString = 0 + nativePowerShell_PowerShellObjectHandle = 1 +) + +type ( + nativePowerShell_GenericPowerShellObject struct { + typeEnum nativePowerShell_PowerShellObjectType + object nativePowerShell_PowerShellObject // can also be union with string + releaseObject byte + } + + nativePowerShell_JsonReturnValues struct { + objects *nativePowerShell_GenericPowerShellObject + count uint32 + } + nativePowerShell_ReceiveJsonCommand func(context uintptr, command nativePowerShell_StringPtr, inputrs *nativePowerShell_PowerShellObject, inputCount uint64, returnValues *nativePowerShell_JsonReturnValues) uintptr +) + +//sys nativePowerShell_CreatePowerShell(handle nativePowerShell_RunspaceHandle) (status nativePowerShell_PowerShellHandle)= psh_host.NativePowerShell_CreatePowerShell +//sys nativePowerShell_CreatePowerShellNested(handle nativePowerShell_PowerShellHandle) (status nativePowerShell_PowerShellHandle)= psh_host.NativePowerShell_CreatePowerShellNested + +//sys nativePowerShell_DeletePowershell(handle nativePowerShell_PowerShellHandle) = psh_host.NativePowerShell_DeletePowershell + +// to fix command was of type *nativePowerShell_ReceiveJsonCommand +// to fix holder was of type *nativePowerShell_LogString_Holder +//sys nativePowerShell_CreateRunspace(context uintptr, command uintptr, holder uintptr) (status nativePowerShell_RunspaceHandle) = psh_host.NativePowerShell_CreateRunspace +//sys nativePowerShell_CreateRemoteRunspace(context uintptr, holder uintptr, computerName *uint16, username *uint16, password *uint16) (status nativePowerShell_RunspaceHandle) = psh_host.NativePowerShell_CreateRemoteRunspace + +//sys nativePowerShell_DeleteRunspace(handle nativePowerShell_RunspaceHandle) = psh_host.NativePowerShell_DeleteRunspace + +//sys nativePowerShell_AddCommand(handle nativePowerShell_PowerShellHandle, command *uint16) (status uint) = psh_host.NativePowerShell_AddCommand +//sys nativePowerShell_AddCommandSpecifyScope( handle nativePowerShell_PowerShellHandle, command *uint16, useLocalScope byte) (status uint) = psh_host.NativePowerShell_AddCommandSpecifyScope +//sys nativePowerShell_AddParameterString( handle nativePowerShell_PowerShellHandle, name *uint16, value *uint16) (status uint) = psh_host.NativePowerShell_AddParameterString +//sys nativePowerShell_AddParameterObject( handle nativePowerShell_PowerShellHandle, name *uint16, object nativePowerShell_PowerShellObject) (status uint) = psh_host.NativePowerShell_AddParameterObject +//sys nativePowerShell_AddArgument( handle nativePowerShell_PowerShellHandle, argument *uint16) (status uint) = psh_host.NativePowerShell_AddArgument +//sys nativePowerShell_AddPSObjectArgument( handle nativePowerShell_PowerShellHandle, object nativePowerShell_PowerShellObject) (status uint) = psh_host.NativePowerShell_AddPSObjectArgument +//sys nativePowerShell_AddPSObjectArguments( handle nativePowerShell_PowerShellHandle, objects *nativePowerShell_PowerShellObject, count uint) (status uint) = psh_host.NativePowerShell_AddPSObjectArguments + +// caller is responsible for calling ClosePowerShellObject on all returned objects, as well as +// calling the appropriate free routine on objects assuming it is not nullptr + +// to fix objects was really of type nativePowerShell_PowerShellObject ** + +//sys nativePowerShell_InvokeCommand(handle nativePowerShell_PowerShellHandle, objects *uintptr, objectCount *uint) (status nativePowerShell_PowerShellObject) = psh_host.NativePowerShell_InvokeCommand +//sys nativePowerShell_AddScript(handle nativePowerShell_PowerShellHandle , path *uint16) (status int) = psh_host.NativePowerShell_AddScript +//sys nativePowerShell_AddScriptSpecifyScope(handle nativePowerShell_PowerShellHandle, path *uint16, useLocalScope byte) (status int)= psh_host.NativePowerShell_AddScriptSpecifyScope +//sys nativePowerShell_ClosePowerShellObject(psobject nativePowerShell_PowerShellObject) = psh_host.NativePowerShell_ClosePowerShellObject + +// to fix status is really nativePowerShell_StringPtr +//sys nativePowerShell_GetPSObjectType(handle nativePowerShell_PowerShellObject) (status uintptr)= psh_host.NativePowerShell_GetPSObjectType + +// to fix status is really nativePowerShell_StringPtr +//sys nativePowerShell_GetPSObjectToString(handle nativePowerShell_PowerShellObject) (status uintptr)= psh_host.NativePowerShell_GetPSObjectToString +//sys nativePowerShell_IsPSObjectNullptr(handle nativePowerShell_PowerShellObject) (status byte) = psh_host.NativePowerShell_IsPSObjectNullptr +//sys nativePowerShell_AddPSObjectHandle(handle nativePowerShell_PowerShellObject) (status nativePowerShell_PowerShellObject)= psh_host.NativePowerShell_AddPSObjectHandle +//sys nativePowerShell_DefaultAlloc(size uint64) (status uintptr) = psh_host.NativePowerShell_DefaultAlloc +//sys nativePowerShell_DefaultFree(address uintptr) = psh_host.NativePowerShell_DefaultFree + +//sys memcpy(dest uintptr, src uintptr, size uint64) (ptr uintptr) = ntdll.memcpy diff --git a/pkg/powershell/readme.md b/pkg/powershell/readme.md new file mode 100644 index 0000000..14f0dea --- /dev/null +++ b/pkg/powershell/readme.md @@ -0,0 +1,6 @@ +#generate + +to generate zpsh_host.go +`go generate` + +You will have to change `modpsh_host = windows.NewLazySystemDLL("psh_host.dll")` to `modpsh_host = windows.NewLazyDLL("psh_host.dll")` diff --git a/pkg/powershell/runspace.go b/pkg/powershell/runspace.go index 70207c7..8815694 100644 --- a/pkg/powershell/runspace.go +++ b/pkg/powershell/runspace.go @@ -1,34 +1,17 @@ package powershell -/* - -#cgo CFLAGS: -I. -#cgo LDFLAGS: -static ${SRCDIR}/../../bin/psh_host.dll - - -#include -#include "powershell.h" - -*/ -import "C" import ( - "unsafe" - - "golang.org/x/sys/windows" "github.com/KnicKnic/go-powershell/pkg/logger" + "golang.org/x/sys/windows" ) -func init() { - C.InitLibraryHelper() -} - type runspaceContext struct { log logger.Full callback CallbackHolder invoking []psCommand // in order list of psCommands we are currently invoking // runspaceContext should contain all the datamembers to reconstrut runspace - handle C.NativePowerShell_RunspaceHandle + handle nativePowerShell_RunspaceHandle contextLookup uint64 } @@ -69,19 +52,18 @@ func CreateRunspace(loggerCallback logger.Simple, callback CallbackHolder) Runsp } context.contextLookup = storeRunspaceContext(context) - var useLogger C.char = 1 + var useLogger byte = 1 if loggerCallback == nil { useLogger = 0 } - var useCommand C.char = 1 + var useCommand byte = 1 if callback == nil { useCommand = 0 } - context.handle = C.CreateRunspaceHelper(C.ulonglong(context.contextLookup), useLogger, useCommand) + context.handle = createRunspaceHelper(context.contextLookup, useLogger, useCommand) return context.recreateRunspace() } - // CreateRemoteRunspace creates a runspace in which to run powershell commands // // This function allows you to specify a logging callback @@ -97,27 +79,23 @@ func CreateRemoteRunspace(loggerCallback logger.Simple, remoteMachine string, us } context.contextLookup = storeRunspaceContext(context) - var useLogger C.char = 1 + var useLogger byte = 1 if loggerCallback == nil { useLogger = 0 } - cRemoteMachine, _ := windows.UTF16PtrFromString(remoteMachine) - ptrRemoteMachine := unsafe.Pointer(cRemoteMachine) cUsername, _ := windows.UTF16PtrFromString(username) - ptrUsername := unsafe.Pointer(cUsername) cPassword, _ := windows.UTF16PtrFromString(password) - ptrPassword := unsafe.Pointer(cPassword) - context.handle = C.CreateRemoteRunspaceHelper(C.ulonglong(context.contextLookup), useLogger, (*C.wchar_t)(ptrRemoteMachine), (*C.wchar_t)(ptrUsername), (*C.wchar_t)(ptrPassword)) + context.handle = createRemoteRunspaceHelper(context.contextLookup, useLogger, cRemoteMachine, cUsername, cPassword) return context.recreateRunspace() } // Close and free a Runspace func (runspace Runspace) Close() { deleteRunspaceContextLookup(runspace.contextLookup) - C.NativePowerShell_DeleteRunspace(runspace.handle) + nativePowerShell_DeleteRunspace(runspace.handle) } diff --git a/pkg/powershell/runspacehelpers.go b/pkg/powershell/runspacehelpers.go new file mode 100644 index 0000000..6dec93d --- /dev/null +++ b/pkg/powershell/runspacehelpers.go @@ -0,0 +1,158 @@ +package powershell + +import ( + "syscall" + "unsafe" +) + +func loggerCallback(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Write(s) + } + return uintptr(0) +} +func loggerCallbackln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Writeln(s) + } + return uintptr(0) +} +func loggerCallbackDebug(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Debug(s) + } + return uintptr(0) +} +func loggerCallbackDebugln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Debugln(s) + } + return uintptr(0) +} +func loggerCallbackVerbose(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Verbose(s) + } + return uintptr(0) +} +func loggerCallbackVerboseln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Verboseln(s) + } + return uintptr(0) +} +func loggerCallbackInformation(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Information(s) + } + return uintptr(0) +} +func loggerCallbackInformationln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Informationln(s) + } + return uintptr(0) +} +func loggerCallbackWarning(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Warning(s) + } + return uintptr(0) +} +func loggerCallbackWarningln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Warningln(s) + } + return uintptr(0) +} +func loggerCallbackError(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Error(s) + } + return uintptr(0) +} +func loggerCallbackErrorln(context uint64, str uintptr) uintptr { + if context != 0 { + s := uintptrMakeString(str) + contextInterface := getRunspaceContext(context) + contextInterface.log.Errorln(s) + } + return uintptr(0) +} + +func commandCallback(context uint64, cMessage uintptr, input uintptr, inputCount uint64, ret uintptr) uintptr { + + var resultsWriter callbackResultsWriter + if context != 0 { + contextInterface := getRunspaceContext(context) + inputArr := make([]Object, inputCount) + for i := uint32(0); uint64(i) < inputCount; i++ { + inputArr[i] = makePowerShellObjectIndexed(input, i) + } + message := uintptrMakeString(cMessage) + contextInterface.callback.Callback(contextInterface.recreateRunspace(), message, inputArr, &resultsWriter) + } + resultsWriter.filloutResults(ret) + return uintptr(0) +} + +var ( + loggerCallbackHolder nativePowerShell_LogString_Holder = nativePowerShell_LogString_Holder{ + Log: syscall.NewCallbackCDecl(loggerCallback), + LogError: syscall.NewCallbackCDecl(loggerCallbackError), + LogWarning: syscall.NewCallbackCDecl(loggerCallbackWarning), + LogInformation: syscall.NewCallbackCDecl(loggerCallbackInformation), + LogVerbose: syscall.NewCallbackCDecl(loggerCallbackVerbose), + LogDebug: syscall.NewCallbackCDecl(loggerCallbackDebug), + LogLine: syscall.NewCallbackCDecl(loggerCallbackln), + LogErrorLine: syscall.NewCallbackCDecl(loggerCallbackErrorln), + LogWarningLine: syscall.NewCallbackCDecl(loggerCallbackWarningln), + LogInformationLine: syscall.NewCallbackCDecl(loggerCallbackInformationln), + LogVerboseLine: syscall.NewCallbackCDecl(loggerCallbackVerboseln), + LogDebugLine: syscall.NewCallbackCDecl(loggerCallbackDebugln), + } + loggerCallbackPointer unsafe.Pointer = unsafe.Pointer(&loggerCallbackHolder) + commandCallbackPointer uintptr = syscall.NewCallbackCDecl(commandCallback) +) + +func createRunspaceHelper(context uint64, useLogger byte, useCommand byte) nativePowerShell_RunspaceHandle { + var commandPtr uintptr = 0 + var loggerPtr uintptr = 0 + if useLogger != 0 { + loggerPtr = uintptr(loggerCallbackPointer) + } + if useCommand != 0 { + commandPtr = commandCallbackPointer + } + return nativePowerShell_CreateRunspace(makeUintptrFromUint64(context), commandPtr, loggerPtr) +} + +func createRemoteRunspaceHelper(context uint64, useLogger byte, remoteMachine *uint16, userName *uint16, password *uint16) nativePowerShell_RunspaceHandle { + var loggerPtr uintptr = 0 + if useLogger != 0 { + loggerPtr = uintptr(loggerCallbackPointer) + } + return nativePowerShell_CreateRemoteRunspace(makeUintptrFromUint64(context), loggerPtr, remoteMachine, userName, password) +} diff --git a/pkg/powershell/zpsh_host.go b/pkg/powershell/zpsh_host.go new file mode 100644 index 0000000..a355078 --- /dev/null +++ b/pkg/powershell/zpsh_host.go @@ -0,0 +1,207 @@ +// Code generated by 'go generate'; DO NOT EDIT. + +package powershell + +import ( + "syscall" + "unsafe" + + "golang.org/x/sys/windows" +) + +var _ unsafe.Pointer + +// Do the interface allocations only once for common +// Errno values. +const ( + errnoERROR_IO_PENDING = 997 +) + +var ( + errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING) +) + +// errnoErr returns common boxed Errno values, to prevent +// allocations at runtime. +func errnoErr(e syscall.Errno) error { + switch e { + case 0: + return nil + case errnoERROR_IO_PENDING: + return errERROR_IO_PENDING + } + // TODO: add more here, after collecting data on the common + // error values see on Windows. (perhaps when running + // all.bat?) + return e +} + +var ( + modpsh_host = windows.NewLazyDLL("psh_host.dll") + modntdll = windows.NewLazySystemDLL("ntdll.dll") + + procnativePowerShell_CreatePowerShell = modpsh_host.NewProc("NativePowerShell_CreatePowerShell") + procnativePowerShell_CreatePowerShellNested = modpsh_host.NewProc("NativePowerShell_CreatePowerShellNested") + procnativePowerShell_DeletePowershell = modpsh_host.NewProc("NativePowerShell_DeletePowershell") + procnativePowerShell_CreateRunspace = modpsh_host.NewProc("NativePowerShell_CreateRunspace") + procnativePowerShell_CreateRemoteRunspace = modpsh_host.NewProc("NativePowerShell_CreateRemoteRunspace") + procnativePowerShell_DeleteRunspace = modpsh_host.NewProc("NativePowerShell_DeleteRunspace") + procnativePowerShell_AddCommand = modpsh_host.NewProc("NativePowerShell_AddCommand") + procnativePowerShell_AddCommandSpecifyScope = modpsh_host.NewProc("NativePowerShell_AddCommandSpecifyScope") + procnativePowerShell_AddParameterString = modpsh_host.NewProc("NativePowerShell_AddParameterString") + procnativePowerShell_AddParameterObject = modpsh_host.NewProc("NativePowerShell_AddParameterObject") + procnativePowerShell_AddArgument = modpsh_host.NewProc("NativePowerShell_AddArgument") + procnativePowerShell_AddPSObjectArgument = modpsh_host.NewProc("NativePowerShell_AddPSObjectArgument") + procnativePowerShell_AddPSObjectArguments = modpsh_host.NewProc("NativePowerShell_AddPSObjectArguments") + procnativePowerShell_InvokeCommand = modpsh_host.NewProc("NativePowerShell_InvokeCommand") + procnativePowerShell_AddScript = modpsh_host.NewProc("NativePowerShell_AddScript") + procnativePowerShell_AddScriptSpecifyScope = modpsh_host.NewProc("NativePowerShell_AddScriptSpecifyScope") + procnativePowerShell_ClosePowerShellObject = modpsh_host.NewProc("NativePowerShell_ClosePowerShellObject") + procnativePowerShell_GetPSObjectType = modpsh_host.NewProc("NativePowerShell_GetPSObjectType") + procnativePowerShell_GetPSObjectToString = modpsh_host.NewProc("NativePowerShell_GetPSObjectToString") + procnativePowerShell_IsPSObjectNullptr = modpsh_host.NewProc("NativePowerShell_IsPSObjectNullptr") + procnativePowerShell_AddPSObjectHandle = modpsh_host.NewProc("NativePowerShell_AddPSObjectHandle") + procnativePowerShell_DefaultAlloc = modpsh_host.NewProc("NativePowerShell_DefaultAlloc") + procnativePowerShell_DefaultFree = modpsh_host.NewProc("NativePowerShell_DefaultFree") + procmemcpy = modntdll.NewProc("memcpy") +) + +func nativePowerShell_CreatePowerShell(handle nativePowerShell_RunspaceHandle) (status nativePowerShell_PowerShellHandle) { + r0, _, _ := syscall.Syscall(procnativePowerShell_CreatePowerShell.Addr(), 1, uintptr(handle), 0, 0) + status = nativePowerShell_PowerShellHandle(r0) + return +} + +func nativePowerShell_CreatePowerShellNested(handle nativePowerShell_PowerShellHandle) (status nativePowerShell_PowerShellHandle) { + r0, _, _ := syscall.Syscall(procnativePowerShell_CreatePowerShellNested.Addr(), 1, uintptr(handle), 0, 0) + status = nativePowerShell_PowerShellHandle(r0) + return +} + +func nativePowerShell_DeletePowershell(handle nativePowerShell_PowerShellHandle) { + syscall.Syscall(procnativePowerShell_DeletePowershell.Addr(), 1, uintptr(handle), 0, 0) + return +} + +func nativePowerShell_CreateRunspace(context uintptr, command uintptr, holder uintptr) (status nativePowerShell_RunspaceHandle) { + r0, _, _ := syscall.Syscall(procnativePowerShell_CreateRunspace.Addr(), 3, uintptr(context), uintptr(command), uintptr(holder)) + status = nativePowerShell_RunspaceHandle(r0) + return +} + +func nativePowerShell_CreateRemoteRunspace(context uintptr, holder uintptr, computerName *uint16, username *uint16, password *uint16) (status nativePowerShell_RunspaceHandle) { + r0, _, _ := syscall.Syscall6(procnativePowerShell_CreateRemoteRunspace.Addr(), 5, uintptr(context), uintptr(holder), uintptr(unsafe.Pointer(computerName)), uintptr(unsafe.Pointer(username)), uintptr(unsafe.Pointer(password)), 0) + status = nativePowerShell_RunspaceHandle(r0) + return +} + +func nativePowerShell_DeleteRunspace(handle nativePowerShell_RunspaceHandle) { + syscall.Syscall(procnativePowerShell_DeleteRunspace.Addr(), 1, uintptr(handle), 0, 0) + return +} + +func nativePowerShell_AddCommand(handle nativePowerShell_PowerShellHandle, command *uint16) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddCommand.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(command)), 0) + status = uint(r0) + return +} + +func nativePowerShell_AddCommandSpecifyScope(handle nativePowerShell_PowerShellHandle, command *uint16, useLocalScope byte) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddCommandSpecifyScope.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(command)), uintptr(useLocalScope)) + status = uint(r0) + return +} + +func nativePowerShell_AddParameterString(handle nativePowerShell_PowerShellHandle, name *uint16, value *uint16) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddParameterString.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value))) + status = uint(r0) + return +} + +func nativePowerShell_AddParameterObject(handle nativePowerShell_PowerShellHandle, name *uint16, object nativePowerShell_PowerShellObject) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddParameterObject.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(name)), uintptr(object)) + status = uint(r0) + return +} + +func nativePowerShell_AddArgument(handle nativePowerShell_PowerShellHandle, argument *uint16) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddArgument.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(argument)), 0) + status = uint(r0) + return +} + +func nativePowerShell_AddPSObjectArgument(handle nativePowerShell_PowerShellHandle, object nativePowerShell_PowerShellObject) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddPSObjectArgument.Addr(), 2, uintptr(handle), uintptr(object), 0) + status = uint(r0) + return +} + +func nativePowerShell_AddPSObjectArguments(handle nativePowerShell_PowerShellHandle, objects *nativePowerShell_PowerShellObject, count uint) (status uint) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddPSObjectArguments.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(objects)), uintptr(count)) + status = uint(r0) + return +} + +func nativePowerShell_InvokeCommand(handle nativePowerShell_PowerShellHandle, objects *uintptr, objectCount *uint) (status nativePowerShell_PowerShellObject) { + r0, _, _ := syscall.Syscall(procnativePowerShell_InvokeCommand.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(objects)), uintptr(unsafe.Pointer(objectCount))) + status = nativePowerShell_PowerShellObject(r0) + return +} + +func nativePowerShell_AddScript(handle nativePowerShell_PowerShellHandle, path *uint16) (status int) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddScript.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(path)), 0) + status = int(r0) + return +} + +func nativePowerShell_AddScriptSpecifyScope(handle nativePowerShell_PowerShellHandle, path *uint16, useLocalScope byte) (status int) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddScriptSpecifyScope.Addr(), 3, uintptr(handle), uintptr(unsafe.Pointer(path)), uintptr(useLocalScope)) + status = int(r0) + return +} + +func nativePowerShell_ClosePowerShellObject(psobject nativePowerShell_PowerShellObject) { + syscall.Syscall(procnativePowerShell_ClosePowerShellObject.Addr(), 1, uintptr(psobject), 0, 0) + return +} + +func nativePowerShell_GetPSObjectType(handle nativePowerShell_PowerShellObject) (status uintptr) { + r0, _, _ := syscall.Syscall(procnativePowerShell_GetPSObjectType.Addr(), 1, uintptr(handle), 0, 0) + status = uintptr(r0) + return +} + +func nativePowerShell_GetPSObjectToString(handle nativePowerShell_PowerShellObject) (status uintptr) { + r0, _, _ := syscall.Syscall(procnativePowerShell_GetPSObjectToString.Addr(), 1, uintptr(handle), 0, 0) + status = uintptr(r0) + return +} + +func nativePowerShell_IsPSObjectNullptr(handle nativePowerShell_PowerShellObject) (status byte) { + r0, _, _ := syscall.Syscall(procnativePowerShell_IsPSObjectNullptr.Addr(), 1, uintptr(handle), 0, 0) + status = byte(r0) + return +} + +func nativePowerShell_AddPSObjectHandle(handle nativePowerShell_PowerShellObject) (status nativePowerShell_PowerShellObject) { + r0, _, _ := syscall.Syscall(procnativePowerShell_AddPSObjectHandle.Addr(), 1, uintptr(handle), 0, 0) + status = nativePowerShell_PowerShellObject(r0) + return +} + +func nativePowerShell_DefaultAlloc(size uint64) (status uintptr) { + r0, _, _ := syscall.Syscall(procnativePowerShell_DefaultAlloc.Addr(), 1, uintptr(size), 0, 0) + status = uintptr(r0) + return +} + +func nativePowerShell_DefaultFree(address uintptr) { + syscall.Syscall(procnativePowerShell_DefaultFree.Addr(), 1, uintptr(address), 0, 0) + return +} + +func memcpy(dest uintptr, src uintptr, size uint64) (ptr uintptr) { + r0, _, _ := syscall.Syscall(procmemcpy.Addr(), 3, uintptr(dest), uintptr(src), uintptr(size)) + ptr = uintptr(r0) + return +} diff --git a/readme.md b/readme.md index d21c0d5..6def0b6 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ [![Build Status](https://dev.azure.com/oneeyedelf1/powershell.native/_apis/build/status/KnicKnic.go-powershell?branchName=master)](https://dev.azure.com/oneeyedelf1/powershell.native/_build/latest?definitionId=3&branchName=master) [![Go Report Card](https://goreportcard.com/badge/github.com/KnicKnic/go-powershell)](https://goreportcard.com/report/github.com/KnicKnic/go-powershell) -[![gopherbadger](https://img.shields.io/badge/Go%20Coverage-100%25-brightgreen.svg?longCache=true&style=flat)](./scripts/code_coverage.ps1) +[![gopherbadger](https://img.shields.io/badge/Go%20Coverage-80%25-brightgreen.svg?longCache=true&style=flat)](./scripts/code_coverage.ps1) [![GoDoc](https://godoc.org/github.com/KnicKnic/go-powershell/pkg/powershell?status.svg)](https://godoc.org/github.com/KnicKnic/go-powershell/pkg/powershell) [![GitHub commits since latest release (branch)](https://img.shields.io/github/commits-since/KnicKnic/go-powershell/latest.svg)](https://github.com/KnicKnic/go-powershell/releases/latest) @@ -13,6 +13,7 @@ Features: 1. Call from golang to powershell 1. Call from powershell to golang (via special Send-HostCommand commandlet) 1. Easy logging - Trap host output in powershell and call custom logging routines in golang +1. Uses syscall - so do not need to use cGo # Status @@ -88,18 +89,11 @@ This project has a dependency on [native-powershell](https://github.com/KnicKnic 1. Simply fetch the dependencies, `go get -d .` and then make sure to build, `go build` 1. Copy the precompiled psh_host.dll into your location so it can be found when running the app - 1. cmd - `copy %GOPATH%\src\github.com\KnicKnic\go-powershell\native-powershell\native-powershell-bin\psh_host.dll .` - 1. powershell - `copy "$($env:GOPATH)\src\github.com\KnicKnic\go-powershell\native-powershell\native-powershell-bin\psh_host.dll" .` + 1. cmd - `copy %GOPATH%\src\github.com\KnicKnic\go-powershell\bin\psh_host.dll .` + 1. powershell - `copy "$($env:GOPATH)\src\github.com\KnicKnic\go-powershell\bin\psh_host.dll" .` 1. I ended up checking in the psh_host.dll and host.h (to make things easy) 1. I could not find a better way to go about this and still have things be easy. -### Getting cgo (so you can compile) - -Windows - install dependencies - you need gcc. I Use chocolatey to install (easiest way to install gcc) - -1. Install chocolatey - 1. https://chocolatey.org/docs/installation#installing-chocolatey -1. `choco install mingw -y` # Docs