标签: kernel32

包装C#for kernel32.dll API

任何包含所有函数 - 方法和结构的kernel32 API包装的助手类?或任何包装生成器?

我想在C#中使用kernel32.dll的所有方法,如下所示:

 [DllImport("kernel32.dll",EntryPoint="RtlMoveMemory")]
        public static extern void RtlMoveMemory(int des, int src, int count);

        [DllImport("kernel32.dll", EntryPoint = "OpenProcess")]
        public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

        [DllImport("kernel32", CharSet = CharSet.Ansi)]
        public extern static int GetProcAddress(int hwnd, string procedureName);

        [DllImport("kernel32.dll", EntryPoint = "GetModuleHandle")]
        public static extern int GetModuleHandle(string lpModuleName);

        [DllImport("kernel32.dll", EntryPoint = "VirtualAllocEx")]
        public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);

        [DllImport("kernel32")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool CloseHandle(IntPtr hObject);

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

c# winapi wrapper kernel32

6
推荐指数
1
解决办法
1万
查看次数

在Asp.net中设置Windows时钟c#

我需要在我的Asp.net网站上设置Windows时钟(用C#编写)

我在stackoverflow中找到了一个解决方案:

如何使用C#将Windows系统时钟设置为正确的本地时间?

但是当我使用它时,我给出了异常:

客户不持有所需的特权

我的应用程序轮询标识是:LocalSystem

asp.net iis privileges kernel32

6
推荐指数
1
解决办法
637
查看次数

将复杂的结构传递给Windows API

我正在尝试GetConsoleScreenBufferInfo(HANDLE, PCONSOLE_SCREEN_BUFFER_INFO)使用Perl 6和(当然)NativeCall从Windows API 使用该函数。

我想我已经CONSOLE_SCREEN_BUFFER_INFO正确设置了功能需要的结构,但是当我尝试转储其内容时,代码在调用后崩溃。

这是证明问题的最短的方法(不是很完全,但是很接近):

use NativeCall;

constant \HANDLE            := Pointer[void];
constant \SHORT             := int16;
constant \USHORT            := uint16;
constant \WORD              := uint16;
constant \DWORD             := uint32;
constant \BOOL              := int32;
constant \STD_OUTPUT_HANDLE := -11;
constant \STD_INPUT_HANDLE  := -10;

class COORD is repr('CStruct')            {
  has SHORT $.X;
  has SHORT $.Y;
}

class SMALL_RECT is repr("CStruct")            {
  has SHORT $.Left;
  has SHORT $.Top;
  has SHORT $.Right;
  has SHORT $.Bottom;
};

class CONSOLE_SCREEN_BUFFER_INFO is repr("CStruct")            { …
Run Code Online (Sandbox Code Playgroud)

winapi perl6 kernel32 nativecall raku

6
推荐指数
1
解决办法
156
查看次数

Kernel32.dll中的CreateFile不允许我打开物理磁盘

我尝试使用下面的代码来获取MBR来自PhysicalDrive0:

private static byte[] ReadMbr(string lpFileName)
{
   byte[] mbr = new byte[512];

   using (SafeFileHandle drive = CreateFile(
         lpFileName: lpFileName,
         dwDesiredAccess: (uint) EFileAccess.GenericRead, //DO NOT MODIFY THE MBR!!!
         dwShareMode: (uint)EFileShare.Write | (uint)EFileShare.Read | (uint)EFileShare.Delete,
         SecurityAttributes: IntPtr.Zero,
         dwCreationDisposition: (uint) ECreationDisposition.OpenAlways,
         dwFlagsAndAttributes: (uint)EFileAttributes.System,
         hTemplateFile: IntPtr.Zero))
   {
      if (drive.IsInvalid)
         throw new IOException("Unable to access drive. Win32 Error Code " + Marshal.GetLastWin32Error());

      //Get the 1st 512 bytes of the volume (MBR)
      using (FileStream stream = new FileStream(drive, FileAccess.Read))
      {
         stream.Read(mbr, 0, …
Run Code Online (Sandbox Code Playgroud)

.net c# windows pinvoke kernel32

5
推荐指数
1
解决办法
3126
查看次数

kernel32.dll Sleep和Thread.Sleep()之间的任何区别

以下内容之间是否存在任何差异(性能,实施.whatever):

一世)

DllImport("kernel32.dll")]
        public extern static void Sleep(uint msec);
Run Code Online (Sandbox Code Playgroud)

..然后调用睡眠功能

II)

Thread.Sleep()
Run Code Online (Sandbox Code Playgroud)

c# multithreading sleep wait kernel32

5
推荐指数
1
解决办法
1710
查看次数

在Go中调用kernel32的ReadProcessMemory

我正在尝试使用Go语言操作Windows上的进程,我开始通过使用来阅读其他进程的内存ReadProcessMemory.

但是,对于大多数地址,我都会收到Error: Only part of a ReadProcessMemory or WriteProcessMemory request was completed.错误.也许我的论据清单是错误的,但我找不到原因.

谁能指出我在这里做错了什么?

package main

import (
  "fmt"
)

import (
  windows "golang.org/x/sys/windows"
)

func main() {
  handle, _ := windows.OpenProcess(0x0010, false, 6100) // 0x0010 PROCESS_VM_READ, PID 6100
  procReadProcessMemory := windows.MustLoadDLL("kernel32.dll").MustFindProc("ReadProcessMemory")

  var data uint   = 0
  var length uint = 0

  for i := 0; i < 0xffffffff; i += 2 {
    fmt.Printf("0x%x\n", i)

    // BOOL ReadProcessMemory(HANDLE hProcess, LPCVOID lpBaseAddress, LPVOID lpBuffer, DWORD nSize, LPDWORD lpNumberOfBytesRead) …
Run Code Online (Sandbox Code Playgroud)

interop unsafe ffi go kernel32

5
推荐指数
1
解决办法
2511
查看次数

以编程方式更改 PowerShell 控制台字体

我开发了一个使用 PowerShell 充当基于控制台的应用程序(例如 ncurses)的脚本。

Lucida Console字体是在脚本的快捷方式中配置的。

我想为用户提供更改字体大小的能力。以下模块就是这样做的,但是字体始终重置为“光栅字体”:https://4sysops.com/archives/change-powershell-console-font-size-with-cmdlet/

我不明白为什么会发生这种情况,因为代码似乎根据对当前字体信息的引用生成合法字体大小的列表。

@sodawillow 的评论让我走上了正确的道路。详细说明...

看来有效字体大小的列表是由控制台窗口大小决定的(可能还有其他我没有考虑到的因素)。

例如,获取-consolefontinfo | format-table在窗口大小为 120x64 时返回以下内容:

nFont dwFontSizeX dwFontSizeY
----- ----------- -----------
0          84           42
1          70           48
2          52           64
3          105          64
4          105          64
5          120          64
6          120          64
7          168          64
8          52           96
9          105          96
10         140          96
11         210          128
Run Code Online (Sandbox Code Playgroud)

而窗口大小为 106x51 时,它返回:

nFont dwFontSizeX dwFontSizeY
----- ----------- -----------
0          104          49
1          114          49
2 …
Run Code Online (Sandbox Code Playgroud)

powershell console-application kernel32

5
推荐指数
1
解决办法
8813
查看次数

F#中是否存在C#和VB兼容的System.Void*?(关闭指向非托管Alloc的指针?)

    [<DllImport("kernel32")>]
    extern bool CloseHandle(System.Void* handle);
    //System.Void also throws same error
    //extern bool CloseHandle(System.Void handle); 
Run Code Online (Sandbox Code Playgroud)

给出错误:

'System.Void'只能在F#中用作'typeof'

    extern bool CloseHandle(typeof<System.Void> handle);
Run Code Online (Sandbox Code Playgroud)

不编译.同样的错误,

"System.Void只能用作...的类型"

F#void*确实编译

    extern bool CloseHandle(void* handle);
Run Code Online (Sandbox Code Playgroud)

但在C#中使用它会引发设计时转换错误

public void CloseBeforeGarbageCollection(IntPtr someAllocIntPtr)
{
    //test unmanaged block
    var result = CloseHandle(someAllocIntPtr.ToPointer());
    return result;
}
Run Code Online (Sandbox Code Playgroud)

'无法从'void*'转换为'System.IntPtr'

虽然传递托管的IntPtr将编译

//test managed IntPtr
var result = CloseHandle(someAllocIntPtr); //throws error at runtime
Run Code Online (Sandbox Code Playgroud)

但是当someAllocIntPtr结果是Marshal.AllocHGlobal,它会抛出一个运行时异常External component has thrown an exception..据我所知,发生这种情况是因为someAllocIntPtr(作为Marshal.AllocHGlobal的结果)在技术上是一个非托管指针的托管指针,与普通的IntPtr不同.Peter Ritchie在回答他的答案时注意到这一点:System.Runtime.InteropServices.SEHException(0x80004005):外部组件抛出异常

避免此运行时异常的唯一方法是将句柄包装在SecureHandle()子类中,但我认为这违反了ref-ref\out-outMSDN上的规则: …

c# vb.net f# interop kernel32

5
推荐指数
1
解决办法
266
查看次数

检测外部进程的窗口是否闪烁/闪烁

我如何检测我无法控制的进程何时因某些通知而闪烁。我只见过专注于您可以控制的应用程序的解决方案。在我的情况下,可能有多个所述进程同时处于活动状态,其中一个可能正在闪烁。

这是我的尝试:

using (Process process = Process.GetProcesses().FirstOrDefault(p => p.ProcessName.ToLower() == "..."))
using (ProcessModule module = process.MainModule)
{

    var a = GetModuleHandleEx(0x00000004, module.ModuleName, out var hModule);
    var hHook = SetWindowsHookEx(HookType.WH_SHELL, (code, param, lParam) =>
    {
        //test
        return IntPtr.Zero;
    }, hModule, 0);
}
Run Code Online (Sandbox Code Playgroud)

其中DLL导入如下:

public enum HookType : int
{
    WH_JOURNALRECORD = 0,
    WH_JOURNALPLAYBACK = 1,
    WH_KEYBOARD = 2,
    WH_GETMESSAGE = 3,
    WH_CALLWNDPROC = 4,
    WH_CBT = 5,
    WH_SYSMSGFILTER = 6,
    WH_MOUSE = 7,
    WH_HARDWARE = 8,
    WH_DEBUG = 9,
    WH_SHELL = …
Run Code Online (Sandbox Code Playgroud)

c# windows hook winforms kernel32

5
推荐指数
1
解决办法
458
查看次数

0x2010的强制完整性级别值代表什么?

我在用户模式进程中运行以下代码片段,当Windows用户帐户登录到工作站时启动.或者,换句话说,其路径放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run注册表项中.

该代码应该确定我的用户进程的强制完整性级别.它是这样的:

DWORD getMIL()
{
    //Try to get integrity level
    //-1                                            Unknown
    //SECURITY_MANDATORY_UNTRUSTED_RID              0x00000000 Untrusted.
    //SECURITY_MANDATORY_LOW_RID                    0x00001000 Low integrity.
    //SECURITY_MANDATORY_MEDIUM_RID                 0x00002000 Medium integrity.
    //SECURITY_MANDATORY_MEDIUM_PLUS_RID            SECURITY_MANDATORY_MEDIUM_RID + 0x100 Medium high integrity.
    //SECURITY_MANDATORY_HIGH_RID                   0X00003000 High integrity.
    //SECURITY_MANDATORY_SYSTEM_RID                 0x00004000 System integrity.
    //SECURITY_MANDATORY_PROTECTED_PROCESS_RID      0x00005000 Protected process.
    DWORD dwIntgtyLvl = -1;

    HANDLE hToken;
    if(OpenProcessToken(::GetCurrentProcess(), TOKEN_QUERY, &hToken))
    {

        DWORD dwSizeIntgtyLvl = 0;
        if(!GetTokenInformation(hToken, TokenIntegrityLevel, NULL, dwSizeIntgtyLvl, &dwSizeIntgtyLvl) &&
            ::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
        {
            BYTE* pbIntgtyLvl = new BYTE[dwSizeIntgtyLvl];
            if(pbIntgtyLvl)
            {
                TOKEN_MANDATORY_LABEL* pTML = …
Run Code Online (Sandbox Code Playgroud)

c c++ windows winapi kernel32

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