标签: kernel32

某些页面上的ReadProcessMemory失败(GetLastError()= 299)

我尝试读取进程的所有提交页面(Win7-64).在大多数页面上它可以工作,但几页失败.我无法解释原因.这是我的测试程序(编译x32,在Win7-64中测试):

#include <windows.h>

void main()
{
    HANDLE hProc = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION,FALSE,GetCurrentProcessId());

    SYSTEM_INFO si;
    ZeroMemory(&si,sizeof(SYSTEM_INFO));
    GetSystemInfo(&si);

    char* buf = new char[si.dwPageSize];

    for (unsigned i = 0; i < 0x7fff0; i++)
    {
        void* baseOffs = (void*) (i * si.dwPageSize);
        MEMORY_BASIC_INFORMATION mbi;
        ZeroMemory(&mbi,sizeof(MEMORY_BASIC_INFORMATION));

        if (VirtualQueryEx(hProc, baseOffs, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == 0)
        {
            MessageBox(NULL, TEXT("VirtualQueryEx failed"),TEXT(""),MB_OK);
        }

        if (mbi.State == MEM_COMMIT)
        {
            SIZE_T numByteWritten = 0;
            if(ReadProcessMemory(hProc, baseOffs,buf,si.dwPageSize,&numByteWritten) == FALSE)
                OutputDebugString(TEXT("bad\n")); //GetLastError()==ERROR_PARTIALLY_READ; numByteWritten == 0;
            else
                OutputDebugString(TEXT("good\n"));

        }
    }

    delete[] buf;
}
Run Code Online (Sandbox Code Playgroud)

我厌倦了查看失败页面的MEMORY_BASIC_INFORMATION,但我没有发现任何奇怪的东西.失败页面的数量也因运行而异(平均约为5).什么阻止我阅读这些页面?我是否需要调整进程令牌中的某些权限?

winapi readprocessmemory windows-7 kernel32

4
推荐指数
1
解决办法
4625
查看次数

JMeter - Webdriver错误:java.lang.NoClassDefFoundError:com/sun/jna/platform/win32/Kernel32

这个错误:

每次我在Jmeter中运行一个测试脚本时都会出现.一切正常......

实际脚本运行后,每次在日志中出现此错误.

我可以忽略这个错误吗?或者它会影响我的测试?

Jmeter: 2.13
Java: 1.8.0.45
Jmeter插件: 1.3(Standard,Extras,ExtraLibs,Webdriver)

selenium jmeter kernel32 selenium-webdriver jmeter-plugins

4
推荐指数
1
解决办法
9842
查看次数

为什么Windows 10中的kernel32.dll上的GetFileVersionInfo返回版本6.2?

使用以下代码,我试图检索kernel32.dll版本,以执行Windows版本检查.但是,由于某种原因,即使kernel32.dll版本(如文件属性中所示)是10.0.10586.0,返回的版本是:6.2.10586.0怎么来的?

    DWORD dwDummy;
    DWORD dwFVISize = GetFileVersionInfoSize(lpszFilePath, &dwDummy);
    LPBYTE lpVersionInfo = new BYTE[dwFVISize];
    if (GetFileVersionInfo(lpszFilePath, 0, dwFVISize, lpVersionInfo) == 0)
    {
        return FALSE;
    }

    UINT uLen;
    VS_FIXEDFILEINFO *lpFfi;
    BOOL bVer = VerQueryValue(lpVersionInfo, L"\\", (LPVOID *)&lpFfi, &uLen);

    if (!bVer || uLen == 0)
    {
        return FALSE;
    }
    DWORD dwFileVersionMS = lpFfi->dwFileVersionMS;
    DWORD dwFileVersionLS = lpFfi->dwFileVersionLS;
    delete[] lpVersionInfo;

    DWORD dwLeftMost = HIWORD(dwFileVersionMS);
    DWORD dwSecondLeft = LOWORD(dwFileVersionMS);
    DWORD dwSecondRight = HIWORD(dwFileVersionLS);
    DWORD dwRightMost = LOWORD(dwFileVersionLS);
Run Code Online (Sandbox Code Playgroud)

Kernel32.dll属性(与SysWow64中的相同): 在此输入图像描述

c++ winapi kernel32 windows-10

4
推荐指数
2
解决办法
2553
查看次数

如何通过Windows本机API获取目录信息?

我能得到的创建日期,文件大小等,为一个文件,使用下面的代码:

// Error handling removed for brevity 
HANDLE hFile = CreateFile(path, GENERIC_READ, FILE_SHARE_READ, 
             NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 

LARGE_INTEGER fileSize; 
GetFileSizeEx(hFile, &fileSize); 

FILE_BASIC_INFO fileInfo); 
GetFileInformationByHandle(hFile, FileBasicInfo, fileInfo, sizeof(fileInfo)); 
Run Code Online (Sandbox Code Playgroud)

但是当针对目录调用时,所有值都设置为零 - 如何获取目录信息?

谢谢

windows winapi kernel32

3
推荐指数
1
解决办法
2444
查看次数

无法在DLL'kernel32.dll'中找到名为'InterlockedIncrement'的入口点 - VS2005 @ Win7 64 bit

我的Visual Studio 2005 C#项目有问题.自星期一以来,我一直在Windows XP下使用它.然后我的笔记本电脑坏了,在我的新笔记本电脑上我有Windows 7 64位,我仍在使用VS 2005.

编译源代码没有问题,但是当我运行程序时它会在下面的行中断

OdbcConnection cn;
cn = new OdbcConnection("dsn=My_dsn_name;");
Run Code Online (Sandbox Code Playgroud)

我收到错误:

EnrtyPointNotFoundExcepition未被取消

无法在DLL'kernel32.dll'中找到名为'InterlockedIncrement'的入口点

我正在尝试使用PostgresODBC 64位驱动程序连接Postgres 8.4数据库.

欢迎任何解决方案或解决方法.我需要强调的是,我正在构建的解决方案需要在Windows XP 32bit下运行.

更新了有关该问题的信息(来自我对评论的回复,但不仅仅是):

  1. 当我尝试向我的VS项目添加新连接时,我收到消息ERROR [IM014] [Microsoft] [ODBC驱动程序管理器]指定的DSN包含驱动程序和应用程序之间的体系结构不匹配.我使用Windows 7 64位,Postgres ODBC 64位驱动程序版本.9.00.0200,Postgres 8.4 32位.
  2. 我之前从未使用过Dependency Walker.但是我从\ system32\ SysWOW64打开了kernel32.dll,InterlockedIncrement出现在两个文件夹的文件中.
  3. 我有一些TableAdapter,我用它们从Postgres中获取数据.它是在我使用WinXP时设置的,它仍然有效.另一方面,当在VS2005中的TableAdapter属性中我点击Data-> CommandText旁边的" ... "时,它会显示一条消息无法调用ODBC驱动程序连接实用程序.

编辑:我在上面添加了1-3点.

c# postgresql 64-bit odbc kernel32

3
推荐指数
2
解决办法
8201
查看次数

如何识别在Delphi应用程序中最终确定期间抛出异常的位置?

我正在与客户进行现场工作,我正在努力帮助他们解决一个复杂的问题.我希望Delphi中有一个工具或功能,我们可以用它来查看内部工作,以帮助我们找到问题所在.

以下是我们正在处理的问题的高级概述.这是一个商业应用程序,目前部署在Delphi 5中.在过去的一年中,该应用程序已迁移到Delphi XE.迁移几乎完成,但遇到了一些严重的错误.

应用程序本身非常庞大,有数百个单元和许多第三方和自定义组件.在我们遇到的一个特定情况中,创建主窗体,然后在显示主窗体之前终止应用程序.结果是在终止期间发生崩溃,因为单元正在最终确定.

调试器正在破坏kernel32的RaiseException函数,该函数由NotifyNonDelphiException调用.我们尝试设置一个非破坏断点,从NotifyNonDelphiException中记录调用堆栈,但这并没有给我们任何有用的东西.调用堆栈仅包含处理异常的方法,即RtlRaiseStatus和KUserExceptionDispatcher.

我们如何识别抛出NotifyNonDelphiException正在处理的原始异常的代码?


编辑:这是在一个异常实例后捕获的两个图像.第一个是引发异常,第二个描述异常对话框关闭后的CPU窗口.

退出时访问冲突

关闭异常对话框时的CPU窗口

新编辑:

我发布这个问题已经有一个多星期了,各种答案给我留下了深刻的印象.对最初问题的一些评论是最有价值的,但是一些答案本身非常有用.

我对该客户的访问已经结束,我将要求他们考虑已在此处发布的答案.虽然我们无法追踪错误的实际来源,但错误的原因显而易见.多年来在没有严重重构的情况下对用户界面进行调整,使应用程序的登录过程不稳定.当用户取消登录时,主表单处于部分初始化状态.当不允许此过程运行时,这是用户中止登录时发生的情况,存在非常严重的终结问题.

该公司购买了AQTime Pro以帮助识别未来的问题,但需要重新设计登录过程,并且从长远来看将解决问题.

有一次,我考虑删除这个问题,但我选择保留它,因为我相信其他人会发现许多优秀的建议,这些建议已经发布了信息.

目前,我接受了@Deltics的答案,因为我讨厌在没有答案的情况下留下问题.但是,我要求这个问题的观众也考虑所有其他答案和评论,它们同样有价值.

delphi debugging kernel32 delphi-xe

3
推荐指数
1
解决办法
2445
查看次数

GetPrivateProfileString无法运行.NET

我想制作一个INI读卡器GetPrivateProfileString.我在用什么:

public class Config
{
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

    private string path;

    public Config(string path)
    {
        this.path = path;
    }

    public string PopValue(string section, string key)
    {
        StringBuilder sb = new StringBuilder();
        GetPrivateProfileString(section, key, "", sb, sb.Length, path);
        return sb.ToString();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的INI文件:

[mysql]
host=localhost
Run Code Online (Sandbox Code Playgroud)

我用的是:

Console.WriteLine(Configuration.PopValue("mysql", "host"));
Run Code Online (Sandbox Code Playgroud)

但是,它只打印出一个空行而不是localhost.我究竟做错了什么?

c# kernel32

3
推荐指数
1
解决办法
6318
查看次数

SetFileTime返回错误代码5

我正在尝试P /调用SetFileTime,但似乎无法正常工作。它总是为我返回5的错误代码(访问被拒绝),我不确定为什么。这是我正在使用的代码:

void Main()
{
    var pointer = CreateFile(@"C:\Users\User\Desktop\New folder\New Text Document.txt", FileAccess.ReadWrite, FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero);
    Console.WriteLine(pointer);
    var now = DateTime.Now.ToFileTime();
    long lpCreationTime = now;
    long lpLastAccessTime = now;
    long lpLastWriteTime = now;
    if (!SetFileTime(pointer, ref lpCreationTime, ref lpLastAccessTime, ref lpLastWriteTime))
        Console.WriteLine(GetLastError());
    CloseHandle(pointer);
}

[DllImport("kernel32.dll")]
static extern UInt32 GetLastError();

[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean SetFileTime(IntPtr hFile, ref long lpCreationTime, ref long lpLastAccessTime, ref long lpLastWriteTime);

[DllImport("kernel32.dll", SetLastError = true)]
static extern Boolean CloseHandle(IntPtr hObject);

[DllImport("kernel32.dll", CharSet …
Run Code Online (Sandbox Code Playgroud)

c# io pinvoke file kernel32

3
推荐指数
1
解决办法
935
查看次数

Windows Kernel32.BatteryLifePercent = 255

我正在尝试构建一个 Java 应用程序,该应用程序读取笔记本电脑电池的状态,并在电量不足时向用户发送通知。为了做到这一点,我将 jna 与 Kernel32 本机库一起使用,如该问题的第一个答案中所述: 如何在 Windows 系统中获得剩余电池寿命?

运行示例,程序产生以下输出:

ACLineStatus: Offline
Battery Flag: High, more than 66 percent
Battery Life: Unknown
Battery Left: 0 seconds
Battery Full: 10832 seconds
Run Code Online (Sandbox Code Playgroud)

电池寿命和电池剩余字段在 Kernel32 BatteryLifePercentBatteryLifeTime值中读取,它们是 255(未知)和 0(我没有得到这个值。根据此处的 Microsoft 文档,未知将为 -1:https : //msdn.microsoft .com/en-us/library/windows/desktop/aa373232(v=vs.85).aspx )。

我的问题是:为什么我要取回这些值?Windows 电池托盘图标显示正确的百分比,那么为什么我无法从这里获取该数据?

我正在运行 64 位 Windows 7 Ultimate Edition。

谢谢你。

windows battery jna windows-7-x64 kernel32

3
推荐指数
1
解决办法
483
查看次数

如何在Delphi中检测通用Windows平台(UWP)

要将用Delphi编写的应用程序添加到Windows应用商店,我必须禁用内部更新机制.例如,通过商店政策10.2.5禁止"检查更新"等内容

所以,我IsRunningAsUwp()DesktopBridgeHelpers项目代码中找到了C#helper函数.我的计划是将该帮助器转换为Delphi代码,但是packageFullName这里的字符串总是空的,即使我通过DesktopBridge转换的项目运行应用程序:

[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern int GetCurrentPackageFullName(ref int packageFullNameLength, StringBuilder packageFullName);

public bool IsRunningAsUwp()
{
    if (IsWindows7OrLower)
    {
        return false;
    }
    else
    {
        int length = 0;
        StringBuilder sb = new StringBuilder(0);
        int result = GetCurrentPackageFullName(ref length, sb);
        sb = new StringBuilder(length);
        result = GetCurrentPackageFullName(ref length, sb);

        return result != APPMODEL_ERROR_NO_PACKAGE;
    }
}
Run Code Online (Sandbox Code Playgroud)

我当前(不工作)的Delphi转换如下所示:

function GetCurrentPackageFullName(out Length: DWORD; out fullName: String): DWORD; stdcall; external kernel32 delayed; …
Run Code Online (Sandbox Code Playgroud)

c# delphi kernel32 desktop-bridge

3
推荐指数
1
解决办法
445
查看次数