任何包含所有函数 - 方法和结构的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) 我需要在我的Asp.net网站上设置Windows时钟(用C#编写)
我在stackoverflow中找到了一个解决方案:
但是当我使用它时,我给出了异常:
客户不持有所需的特权
我的应用程序轮询标识是:LocalSystem
我正在尝试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) 我尝试使用下面的代码来获取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) 以下内容之间是否存在任何差异(性能,实施.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) 我正在尝试使用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) 我开发了一个使用 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) [<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-out
MSDN上的规则: …
我如何检测我无法控制的进程何时因某些通知而闪烁。我只见过专注于您可以控制的应用程序的解决方案。在我的情况下,可能有多个所述进程同时处于活动状态,其中一个可能正在闪烁。
这是我的尝试:
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) 我在用户模式进程中运行以下代码片段,当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)