第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Go 中調(diào)用 EnumServicesStatusEx,內(nèi)存分配?

在 Go 中調(diào)用 EnumServicesStatusEx,內(nèi)存分配?

Go
紫衣仙女 2022-01-10 16:39:41
我正在編寫一個與 Windows 服務(wù)中的 Windows API 交互的應(yīng)用程序。之后從@chowey幫助負(fù)載在這里,我有點(diǎn)得到的東西的竅門,并開始,我已經(jīng)把在GitHub上一個基本庫在這里。我現(xiàn)在轉(zhuǎn)到“服務(wù)”,要求列出機(jī)器上的所有 Windows 服務(wù),啟動、停止、重新啟動它們。一旦你有一個服務(wù)句柄可以使用,啟動/停止/重新啟動看起來很簡單,但我正在努力獲取已安裝服務(wù)的列表。Advapi32.dll 中的EnumServicesStatusEx是我需要調(diào)用的函數(shù),但它需要一個指向ENUM_SERVICE_STATUS_PROCESS結(jié)構(gòu)數(shù)組的預(yù)分配內(nèi)存的指針。您可以使用空指針調(diào)用該函數(shù),它將返回所需的內(nèi)存分配大小,但我不相信有一種方法可以直接在 Go 中分配內(nèi)存。起初我以為我可以得到內(nèi)存分配要求,使用 unsafe 包將它除以結(jié)構(gòu)的 SizeOf,創(chuàng)建一個包含該數(shù)量元素的切片,然后將指向第一個元素的指針傳遞給函數(shù),但它說的是內(nèi)存需要為字符串?dāng)?shù)據(jù)包含空間,而這不會。有誰知道這是如何實(shí)現(xiàn)的,漂亮嗎?:)。
查看完整描述

1 回答

?
楊__羊羊

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個贊

在@alex 的建議之后,我得到了以下示例代碼。


看起來我們創(chuàng)建了一個正確大小的字節(jié)切片,然后使用 unsafe 類轉(zhuǎn)換為我們的結(jié)構(gòu)類型。


    _, _, _ = svcEnumServicesStatusEx.Call(

        uintptr(handle),

        uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),

        uintptr(uint32(SVC_SERVICE_WIN32)),

        uintptr(uint32(SVC_SERVICE_STATE_ALL)),

        uintptr(0),

        0,

        uintptr(unsafe.Pointer(&bytesReq)),

        uintptr(unsafe.Pointer(&numReturned)),

        uintptr(unsafe.Pointer(&resumeHandle)),

        uintptr(0),

    )


    if bytesReq > 0 {

        var buf []byte = make([]byte, bytesReq)


        ret, _, _ := svcEnumServicesStatusEx.Call(

            uintptr(handle),

            uintptr(uint32(SVC_SC_ENUM_PROCESS_INFO)),

            uintptr(uint32(SVC_SERVICE_WIN32)),

            uintptr(uint32(SVC_SERVICE_STATE_ALL)),

            uintptr(unsafe.Pointer(&buf[0])),

            uintptr(bytesReq),

            uintptr(unsafe.Pointer(&bytesReq)),

            uintptr(unsafe.Pointer(&numReturned)),

            uintptr(unsafe.Pointer(&resumeHandle)),

            uintptr(0),

        )


        if ret > 0 {

            var sizeTest ENUM_SERVICE_STATUS_PROCESS

            iter := uintptr(unsafe.Pointer(&buf[0]))


            for i := uint32(0); i < numReturned; i++ {

                var data *ENUM_SERVICE_STATUS_PROCESS = (*ENUM_SERVICE_STATUS_PROCESS)(unsafe.Pointer(iter))


                fmt.Printf("Service Name: %s - Display Name: %s - %#v\r\n", syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpServiceName))[:]), syscall.UTF16ToString((*[4096]uint16)(unsafe.Pointer(data.lpDisplayName))[:]), data.ServiceStatusProcess)


                iter = uintptr(unsafe.Pointer(iter + unsafe.Sizeof(sizeTest)))

            }

        } else {

            return nil, fmt.Errorf("Failed to get Service List even with allocated memory.")

        }

    } else {

        return nil, fmt.Errorf("Unable to get size of required memory allocation.")

    }


查看完整回答
反對 回復(fù) 2022-01-10
  • 1 回答
  • 0 關(guān)注
  • 223 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號