首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将整数转换为_LARGE_INTEGERS

将整数转换为_LARGE_INTEGERS
EN

Stack Overflow用户
提问于 2021-02-24 17:57:09
回答 1查看 172关注 0票数 0

我试图调用NtDelayExecution,但似乎不知道如何将int转换为_LARGE_INTEGER ( NtDelayExecution函数请求的格式)。(http://www.codewarrior.cn/ntdoc/winnt/ex/NtDelayExecution.htm)

我目前的代码是:

代码语言:javascript
复制
    LARGE_INTEGER DelayTimeConverted = HIBERNATION_TIME;
    ((NtDelayExecPrototype)(NtDelayExecutionPtr))(FALSE, DelayTimeConverted);

其中HIBERNATION_TIME被定义为:#define HIBERATNATION_TIME 123 (占位符值)。

当我试图编译时,我会得到一个类似于no suitable constructor exists to convert int to _LARGE_INTEGER的错误--任何帮助都是非常感谢的。

编辑:我的平台是Windows 10,我已经尝试过更改_LARGE_INTEGER现在是unsigned int的函数,但是延迟并没有发生。

EDIT2:这是我的全部功能:

代码语言:javascript
复制
void NtDelayExecution (  ) {
    typedef void(WINAPI* NtDelayExecPrototype)(BOOLEAN, PLARGE_INTEGER);//PLARGE_INTEGER);

    FARPROC NtDelayExecutionPtr = 0x0;
    HMODULE NtDLLModule = GetModuleHandleA("ntdll.dll");
    // Error checking omitted.

    LARGE_INTEGER DelayTimeConverted;
    DelayTimeConverted.QuadPart = HIBERNATION_TIME;
    ((NtDelayExecPrototype)(NtDelayExecutionPtr))(FALSE, &DelayTimeConverted);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 18:31:20

整型是一个union,包含两个32位整数LowPart (DWORD)和HighPart (LONG),它们位于64位整数QuadPart (LONGLONG)之上:

代码语言:javascript
复制
typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } DUMMYSTRUCTNAME;
  struct {
    DWORD LowPart;
    LONG  HighPart;
  } u;
  LONGLONG QuadPart;
} LARGE_INTEGER;

在这种情况下,您可以将int分配给QuadPart成员:

代码语言:javascript
复制
LARGE_INTEGER DelayTimeConverted;
DelayTimeConverted.QuadPart = HIBERNATION_TIME;
((NtDelayExecPrototype)(NtDelayExecutionPtr))(FALSE, &DelayTimeConverted);

还请注意&,因为NtDelayExecution()按指针获取LARGE_INTEGER (这是PLARGE_INTEGER中的P所代表的)。

UPDATE:也就是说,您所显示的函数是调用GetModuleHandle(),但是之后在哪里调用GetProcAddress()来初始化NtDelayExecutionPtr呢?你应该这样做:

代码语言:javascript
复制
NTSTATUS NtDelayExecution()
{
    typedef NTSTATUS (WINAPI* NtDelayExecPrototype)(BOOLEAN, PLARGE_INTEGER);

    HMODULE NtDLLModule = GetModuleHandle(TEXT("ntdll.dll"));
    NtDelayExecPrototype NtDelayExecutionPtr = GetProcAddress(NtDLLModule, "NtDelayExecution");

    if (NtDelayExecutionPtr == NULL)
        return STATUS_NOT_IMPLEMENTED;

    LARGE_INTEGER DelayTimeConverted;
    DelayTimeConverted.QuadPart = HIBERNATION_TIME;
    return NtDelayExecutionPtr(FALSE, &DelayTimeConverted);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66356313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档