小编wj3*_*j32的帖子

注册表监控,包括内核模式注册表访问?

我记得在我最后一年的大学项目中我编写了一个C#注册表监视器,然而,当我将它与Microsoft ProcessMonitor应用程序进行比较时(我记不清它的确切名称,但是它是由MSoft收购的公司),我没有捕获尽可能多的注册表调用.

这是因为我使用的是C#包装器,因此它只会捕获用户模式注册表访问吗?

我使用了这个包装器:http://www.codeproject.com/KB/DLL/EasyHook64.aspx

为了捕获内核模式注册表访问,我必须用C++编写?

c# c++ api-hook

7
推荐指数
1
解决办法
4615
查看次数

API设计 - 分配输出?

C API函数分配输出或让用户指定输出缓冲区是一个好主意吗?例如:

BOOL GetString(
    PWSTR *String
    );
...
PWSTR string;
GetString(&string);
Free(string);
Run Code Online (Sandbox Code Playgroud)

VS

BOOL GetString(
    PWSTR Buffer,
    ULONG BufferSize,
    PULONG RequiredBufferSize
    );
...
// A lot more code than in the first case
Run Code Online (Sandbox Code Playgroud)

更具体地说,我想知道为什么Win32 API主要使用第二种情况(例如GetWindowText,LookupAccountSid).如果API函数知道输出有多大,为什么用户会尝试猜测输出大小?我找不到有关为何使用第二种情况的任何信息.

另外:LookupAccountSid示例特别糟糕.在内部,它使用LSA API,为调用者分配输出.然后LookupAccountSid让用户在只能从LSA返回输出时分配缓冲区(并猜测正确的缓冲区大小)!为什么?

c api api-design

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

调整大小时Win32 GUI闪烁

我有一个带有选项卡控件的Win32 GUI程序,每个选项卡都有一个列表视图控件.每当调整窗口大小时,都会出现大量闪烁.我尝试过以下的事情:

  • 在主wndproc中处理WM_ERASEBKGND并返回TRUE.没有效果.
  • 过滤掉事件循环中的所有WM_ERASEBKGND消息.没有效果.
  • 在主窗口上设置WM_CLIPCHILDREN样式.现在,当调整窗口大小时,列表视图控件将被简单地擦除为白色背景并且不会重绘.
  • 使用DefWindowPos而不是MoveWindow.没有效果.
  • 在MoveWindow中为bRepaint传递FALSE.与设置WS_CLIPCHILDREN相同(见上文).

这是RegisterClassEx代码:

memset(&wcex, 0, sizeof(WNDCLASSEX));
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = PhMainWndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = PhInstanceHandle;
wcex.hIcon = LoadIcon(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
//wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDR_MAINWND);
wcex.lpszClassName = PhWindowClassName;
wcex.hIconSm = (HICON)LoadImage(PhInstanceHandle, MAKEINTRESOURCE(IDI_PROCESSHACKER), IMAGE_ICON, 16, 16, 0);
Run Code Online (Sandbox Code Playgroud)

WM_SIZE处理程序:

RECT rect;

// Resize the tab control.

GetClientRect(PhMainWndHandle, &rect);
MoveWindow(TabControlHandle, rect.left, rect.top,
    rect.right - rect.left, rect.bottom - rect.top, TRUE);

// Resize the list …
Run Code Online (Sandbox Code Playgroud)

user-interface winapi resize flicker

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

C#:将通用指针转换为数组

我想将a转换byte*为a byte[],但我也希望有一个可重用的函数来执行此操作:

public unsafe static T[] Create<T>(T* ptr, int length)
{
    T[] array = new T[length];

    for (int i = 0; i < length; i++)
        array[i] = ptr[i];

    return array;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我收到编译器错误,因为T可能是".NET托管类型",我们无法指向那些.更令人沮丧的是,没有泛型类型约束可以将T限制为"非托管类型".是否有内置的.NET函数来执行此操作?有任何想法吗?

c# arrays unsafe

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

.NET承诺与预留堆大小

我的程序有7,667,712个字节的已提交堆,但它有33,546,240个保留堆字节!我可以看到该程序使用大约44 MB的专用字节.如何让.NET GC为托管堆保留更少的空间?

.net garbage-collection memory-management

2
推荐指数
1
解决办法
2783
查看次数