如何将整数转换为 LARGE_INTEGER
How to convert an Integer to LARGE_INTEGER
如何将整数转换为 LARGE_INTEGER?
例如,当我想立即触发一个定时器时:
LARGE_INTEGER zero;
zero.QuadPart = 0;
KeSetTimer(pTimer, zero, pDpc);
有什么方法可以将 0 转换为 LARGE_INTEGER 吗?所以我可以这样做:
KeSetTimer(pTimer, (SomeType)0, pDpc);
我试过:
KeSetTimer(pTimer, (LARGE_INTEGER )0, pDpc);
但是没用。我已用 Google 搜索,但找不到任何帮助。
LARGE_INTEGER
是一个 struct
。
无法将值转换为结构类型。
您需要创建结构的实例并根据需要设置其字段。
例如:
LARGE_INTEGER intToLargeInt(int i) {
LARGE_INTEGER li;
li.QuadPart = i;
return li;
}
然后你可以像这样使用它:
KeSetTimer(pTimer, intToLargeInt(0), pDpc);
为了扩展和增强以前对该问题的回答以获得更大的可移植性,LARGE_INTEGER 实际上是两个结构的联合,旨在表示 64 位带符号的整数值,同时还考虑了编译器可能没有对 64 位整数数据类型的内置支持的情况。
如文档托管于:https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-large_integer~r1 所述:
If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.
在后一种情况下,必须组成一个 signed long long 整数,由 C99 保证 标准的 HighPart 和 LowPart[=34= 的宽度至少为 64 位(如 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 中指定) ] 给定的 LARGE_INTEGER 个对象,每个对象的宽度为 32 位。
这可以通过将 HighPart 的所有位左移 32,然后将结果与 LowPart[=34= 按位或运算来完成] 成员以便设置其低 32 位。
因此,逆向操作就是屏蔽掉给定long long integer的32位High和Low部分,并对应分配给一个LARGE_INTEGER实例的成员。
下面是这两个操作的代码示例,确保编译器本身不支持 64 位整数的情况也被考虑在内:
// LARGE_INTEGER to 64-bit integral type:
static long long toInteger(LARGE_INTEGER const & integer)
{
#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
return integer.QuadPart;
#else
return (static_cast<long long>(integer.HighPart) << 32) | integer.LowPart;
#endif
}
// signed long long to LARGE_INTEGER object:
static LARGE_INTEGER toLargeInteger(long long value)
{
LARGE_INTEGER result;
#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
result.QuadPart = value;
#else
result.high_part = value & 0xFFFFFFFF00000000;
result.low_part = value & 0xFFFFFFFF;
#endif
return result;
}
是的,但是如果您使用的是 C#,LARGE_INTEGER 是一个 64 位有符号整数,那么为什么不直接使用 System.Int64,或者如果您愿意,
"using LARGE_INTEGER = System.Int64" // 就像不调用整个库的 System.Int64 一样,这也是防止函数中毒的“良好做法”
如何将整数转换为 LARGE_INTEGER?
例如,当我想立即触发一个定时器时:
LARGE_INTEGER zero;
zero.QuadPart = 0;
KeSetTimer(pTimer, zero, pDpc);
有什么方法可以将 0 转换为 LARGE_INTEGER 吗?所以我可以这样做:
KeSetTimer(pTimer, (SomeType)0, pDpc);
我试过:
KeSetTimer(pTimer, (LARGE_INTEGER )0, pDpc);
但是没用。我已用 Google 搜索,但找不到任何帮助。
LARGE_INTEGER
是一个 struct
。
无法将值转换为结构类型。
您需要创建结构的实例并根据需要设置其字段。
例如:
LARGE_INTEGER intToLargeInt(int i) {
LARGE_INTEGER li;
li.QuadPart = i;
return li;
}
然后你可以像这样使用它:
KeSetTimer(pTimer, intToLargeInt(0), pDpc);
为了扩展和增强以前对该问题的回答以获得更大的可移植性,LARGE_INTEGER 实际上是两个结构的联合,旨在表示 64 位带符号的整数值,同时还考虑了编译器可能没有对 64 位整数数据类型的内置支持的情况。
如文档托管于:https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-large_integer~r1 所述:
If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.
在后一种情况下,必须组成一个 signed long long 整数,由 C99 保证 标准的 HighPart 和 LowPart[=34= 的宽度至少为 64 位(如 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 中指定) ] 给定的 LARGE_INTEGER 个对象,每个对象的宽度为 32 位。
这可以通过将 HighPart 的所有位左移 32,然后将结果与 LowPart[=34= 按位或运算来完成] 成员以便设置其低 32 位。
因此,逆向操作就是屏蔽掉给定long long integer的32位High和Low部分,并对应分配给一个LARGE_INTEGER实例的成员。
下面是这两个操作的代码示例,确保编译器本身不支持 64 位整数的情况也被考虑在内:
// LARGE_INTEGER to 64-bit integral type:
static long long toInteger(LARGE_INTEGER const & integer)
{
#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
return integer.QuadPart;
#else
return (static_cast<long long>(integer.HighPart) << 32) | integer.LowPart;
#endif
}
// signed long long to LARGE_INTEGER object:
static LARGE_INTEGER toLargeInteger(long long value)
{
LARGE_INTEGER result;
#ifdef INT64_MAX // Does the compiler natively support 64-bit integers?
result.QuadPart = value;
#else
result.high_part = value & 0xFFFFFFFF00000000;
result.low_part = value & 0xFFFFFFFF;
#endif
return result;
}
是的,但是如果您使用的是 C#,LARGE_INTEGER 是一个 64 位有符号整数,那么为什么不直接使用 System.Int64,或者如果您愿意, "using LARGE_INTEGER = System.Int64" // 就像不调用整个库的 System.Int64 一样,这也是防止函数中毒的“良好做法”