Узнать активный дескриптор (блокировку) процесса в специальном файле с помощью WINAPI - PullRequest
0 голосов
/ 09 ноября 2019

Я хочу использовать этот скрипт в качестве ресурса для записи так же, как в Go для Windows, используя Windows API (менеджер сброса)

Пока мой код

Rstrtmgr, _ := syscall.LoadLibrary("Rstrtmgr.dll")
RmStartSession, _ := syscall.GetProcAddress(Rstrtmgr, "RmStartSession")
RmRegisterResources, _ := syscall.GetProcAddress(Rstrtmgr, "RmRegisterResources")

var dwSession uint32 = 0x0
var szSessionKey string
ret, _, callErr := syscall.Syscall9(RmStartSession,
    3,
    uintptr(unsafe.Pointer(&dwSession)),
    uintptr(0x0),
    uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(szSessionKey))),
    0,
    0,
    0,
    0,
    0,
    0)

// code crash here
ret, _, callErr = syscall.Syscall9(RmRegisterResources,
    7,
    uintptr(dwSession),
    uintptr(1),
    uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(szPath))),
    uintptr(0),
    uintptr(unsafe.Pointer(nil)),
    uintptr(0),
    uintptr(unsafe.Pointer(nil)),
    0,
    0)

_ = ret
_ = callErr

но это сбой в RmRegisterResources.

моя цель - получить PID этого процесса, заблокировать мой файл по пути

1 Ответ

0 голосов
/ 11 ноября 2019

RmRegisterResources нужен rgsFileName s , что означает указатель строки (имен) файла. Вы можете передать массив строки (строк) или просто передать адрес строки имени файла, есливам нужно работать только с одним специальным файлом.

var rgsFileNames = unsafe.Pointer(syscall.StringToUTF16Ptr(szPath));
ret, _, callErr = syscall.Syscall9(RmRegisterResources,
    7,
    uintptr(dwSession),
    uintptr(1),
    uintptr(unsafe.Pointer(&rgsFileNames)),
    uintptr(0),
    uintptr(unsafe.Pointer(nil)),
    uintptr(0),
    uintptr(unsafe.Pointer(nil)),
    0,
    0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...