diff options
Diffstat (limited to 'vendor/github.com/AllenDang/w32/alpc_test.go')
-rw-r--r-- | vendor/github.com/AllenDang/w32/alpc_test.go | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/vendor/github.com/AllenDang/w32/alpc_test.go b/vendor/github.com/AllenDang/w32/alpc_test.go new file mode 100644 index 0000000..6d1c7d4 --- /dev/null +++ b/vendor/github.com/AllenDang/w32/alpc_test.go @@ -0,0 +1,137 @@ +package w32 + +import ( + "testing" +) + +var testPortName = "\\TestAlpcPort" + +var basicPortAttr = ALPC_PORT_ATTRIBUTES{ + MaxMessageLength: uint64(SHORT_MESSAGE_MAX_SIZE), + SecurityQos: SECURITY_QUALITY_OF_SERVICE{ + Length: SECURITY_QOS_SIZE, + ContextTrackingMode: SECURITY_DYNAMIC_TRACKING, + EffectiveOnly: 1, + ImpersonationLevel: SecurityAnonymous, + }, + Flags: ALPC_PORFLG_ALLOW_LPC_REQUESTS, + DupObjectTypes: ALPC_SYNC_OBJECT_TYPE, +} + +func ObjectAttributes(name string) (oa OBJECT_ATTRIBUTES, e error) { + + sd, e := InitializeSecurityDescriptor(1) + if e != nil { + return + } + + e = SetSecurityDescriptorDacl(sd, nil) + if e != nil { + return + } + + oa, e = InitializeObjectAttributes(name, 0, 0, sd) + return +} + +func Send( + hPort HANDLE, + msg *AlpcShortMessage, + flags uint32, + pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, + timeout *int64, +) (e error) { + + e = NtAlpcSendWaitReceivePort(hPort, flags, msg, pMsgAttrs, nil, nil, nil, timeout) + return + +} + +func Recv( + hPort HANDLE, + pMsg *AlpcShortMessage, + pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES, + timeout *int64, +) (bufLen uint32, e error) { + + bufLen = uint32(pMsg.TotalLength) + e = NtAlpcSendWaitReceivePort(hPort, 0, nil, nil, pMsg, &bufLen, pMsgAttrs, timeout) + return + +} + +// Convenience method to create an ALPC port with a NULL DACL. Requires an +// absolute port name ( where / is the root of the kernel object directory ) +func CreatePort(name string) (hPort HANDLE, e error) { + + oa, e := ObjectAttributes(name) + if e != nil { + return + } + + hPort, e = NtAlpcCreatePort(&oa, &basicPortAttr) + + return +} + +func ConnectPort(serverName, clientName string, pConnMsg *AlpcShortMessage) (hPort HANDLE, e error) { + + oa, e := InitializeObjectAttributes(clientName, 0, 0, nil) + if e != nil { + return + } + + hPort, e = NtAlpcConnectPort( + serverName, + &oa, + &basicPortAttr, + ALPC_PORFLG_ALLOW_LPC_REQUESTS, + nil, + pConnMsg, + nil, + nil, + nil, + nil, + ) + + return +} + +func Accept( + hSrv HANDLE, + context *AlpcPortContext, + pConnReq *AlpcShortMessage, + accept bool, +) (hPort HANDLE, e error) { + + oa, _ := InitializeObjectAttributes("", 0, 0, nil) + + var accepted uintptr + if accept { + accepted++ + } + + hPort, e = NtAlpcAcceptConnectPort( + hSrv, + 0, + &oa, + &basicPortAttr, + context, + pConnReq, + nil, + accepted, + ) + + return +} + +func TestNtAlpcCreatePort(t *testing.T) { + + hPort, err := CreatePort(testPortName) + + if err != nil { + t.Errorf("failed to create ALPC port %v: %v", testPortName, err) + } else { + t.Logf("[OK] Created ALPC port %v with handle 0x%x", testPortName, hPort) + } +} |