有没有办法调用CreateProcess,以便杀死父进程自动杀死子进程?
也许使用Create Process Flags?
编辑
解决方案是创建作业对象,将父级和子级放在作业对象中.当父母被杀后,孩子被杀.我从这里得到了代码:
当父进程被杀死时杀死子进程
记下@wilx关于继承句柄的注释.
在Windows上,声明的函数RtlMoveMemory
提供了一种将字节块从一个地址复制到另一个地址的方法:
Private Declare PtrSafe Sub RtlMoveMemory Lib "kernel32" ( _
ByVal dest As LongPtr, _
ByVal src As LongPtr, _
ByVal size As LongPtr)
Run Code Online (Sandbox Code Playgroud)
Mac OS X上的等价物是什么?
出于某种原因,每当我的C#.NET 2.0应用程序调用GetProcAddress
它时,总是返回零.
public class MyClass
{
internal static class UnsafeNativeMethods
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool SetDllDirectory(string lpPathName);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
}
private void MyFunc()
{
IntPtr _dllHandle;
IntPtr _fptr;
string _fullPath = ".\\mydll.dll";
string _procName = "MyDllFunc";
_dllHandle = UnsafeNativeMethods.LoadLibrary(_fullPath);
_fptr = UnsafeNativeMethods.GetProcAddress(_dllHandle, _procName); // <-- …
Run Code Online (Sandbox Code Playgroud) 所以我试图将遗留应用程序从32位编译到64位.我重新编译了它使用的所有库,并使其查看到WIN SDK6.0A x64位用于库.
我在用:
Everythings终于出现但我得到这些奇怪的未定义符号错误:
error LNK2019: unresolved external symbol InterlockedDecrement referenced in function ...
error LNK2019: unresolved external symbol InterlockedIncrement referenced in function ...
error LNK2019: unresolved external symbol GetModuleBaseName referenced in ...
error LNK2019: unresolved external symbol EnumProcessModules referenced in ...
error LNK2019: unresolved external symbol EnumProcesses referenced in ...
error LNK2019: unresolved external symbol GetProcessMemoryInfo referenced
Run Code Online (Sandbox Code Playgroud)
问题是这些都是来自SDK的胜利.InterlockedDec和InterlockedInc来自kernel32.lib GetModuleBaseName,EnumProcessModules,EnumProcesses,GetProcessMemoryInfo在psapi.h中,但也包含kernel32.lib或psapi.lib
I checked C:\Program …
我需要通过.net应用程序重命名我的电脑.我试过这段代码:
public static bool SetMachineName(string newName)
{
MessageBox.Show(String.Format("Setting Machine Name to '{0}'...", newName));
// Invoke WMI to populate the machine name
using (ManagementObject wmiObject = new ManagementObject(new ManagementPath(String.Format("Win32_ComputerSystem.Name='{0}'",System.Environment.MachineName))))
{
ManagementBaseObject inputArgs = wmiObject.GetMethodParameters("Rename");
inputArgs["Name"] = newName;
// Set the name
ManagementBaseObject outParams = wmiObject.InvokeMethod("Rename",inputArgs,null);
uint ret = (uint)(outParams.Properties["ReturnValue"].Value);
if (ret == 0)
{
//worked
return true;
}
else
{
//didn't work
return false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我试过这个:
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
static extern bool SetComputerName(string lpComputerName);
public static bool SetMachineName(string …
Run Code Online (Sandbox Code Playgroud) 我正在分析流程加载的各种模块.不幸的是,我无法创建kernel32.dll
内存快照,尽管该功能可以与其他模块正常工作(例如ntddl.dll
).问题出在以下代码中:
/* Copy code from memory */
if (VirtualProtect((BYTE*)virtualAddress, sizeOfCode, PAGE_EXECUTE_READWRITE, &flags) == 0) {
std::cout << "VirtualProtect failed!" << std::endl;
std::cout << "Virtual address: " << virtualAddress << std::endl;
std::cout << "Size of code: " << sizeOfCode << std::endl;
std::cout << "Error code: " << GetLastError() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
调用此代码的结果kernel32.dll
是:
Virtual address: 747d0000
Size of code: 6a000
Error code: 0x1e7
Run Code Online (Sandbox Code Playgroud)
错误描述说:
ERROR_INVALID_ADDRESS
487 (0x1E7)
Attempt to access invalid address.
Run Code Online (Sandbox Code Playgroud)
我检查了进程'内存映射和kernel32.dll地址是否正确.原因是什么?
我正在为Windows7编写一些内核端代码来访问在用户模式下创建的共享内存,如此处所示.
共享内存在用户空间中创建,名称为:
"MySharedMem"
Run Code Online (Sandbox Code Playgroud)
在用户空间中打开共享内存有效.
在内核模式下打开相同的共享内存调用 ZwOpenSection
失败返回:
#define STATUS_OBJECT_NAME_NOT_FOUND ((NTSTATUS)0xC0000034L)
Run Code Online (Sandbox Code Playgroud)
内核代码是:
NTSTATUS CModule1::OpenShared()
{
SIZE_T vs = 256;
WCHAR stringBuffer[] = L"\\BaseNamedObjects\\MySharedMem";
UNICODE_STRING sectionName;
RtlInitUnicodeString(§ionName,stringBuffer);
OBJECT_ATTRIBUTES myAttributes;
InitializeObjectAttributes(&myAttributes,§ionName,0,NULL,NULL);
NTSTATUS status0 = ZwOpenSection(§ionHandle_,SECTION_MAP_READ|SECTION_MAP_WRITE,&myAttributes);
NTSTATUS status = ZwMapViewOfSection(§ionHandle_, ZwCurrentProcess(), (PVOID *)&pSharedData_, 0, 0, NULL, &vs, ViewShare, 0, PAGE_READWRITE);
return status;
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几个名字(L"\\MySharedMem"
或L"MySharedMem"
),但我得到了其他错误STATUS_OBJECT_PATH_INVALID
或STATUS_OBJECT_PATH_NOT_FOUND
.
同时创建共享内存"Global\\MySharedMem"
不起作用.
我究竟做错了什么?
我尝试在内核模式下创建共享内存,我获得了成功ZwCreateSection
,ZwMapViewOfSection
但是当我访问pSharedData_指针来测试缓冲区时,我得到了访问冲突:
NTSTATUS CModule1::MapUserSection()
{
typedef struct SHARED_SECTION {DWORD i; };
NTSTATUS status …
Run Code Online (Sandbox Code Playgroud) 我在Windows 7上安装了VS2013和VS2015.
我有一个现有的C++ Dll项目正在建设正常但现在突然间它不会使用VS2015构建并给我错误:
LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
Run Code Online (Sandbox Code Playgroud)
从这篇文章:致命错误LNK1104:无法打开文件'kernel32.lib'我去找了kernel32.lib文件,它位于这里:
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86
Run Code Online (Sandbox Code Playgroud)
当我转到我的项目属性 - >链接器 - >输入并选择宏时,我看到这条路径确实存在:
我的平台工具集设置为Visual Studio 2013 - Windows XP(v120_xp),它始终设置为.
为什么我的项目突然停止建设?什么可能出错?
我从C#应用程序调用CopyFileEx,并将匿名委托传递给LPPROGRESS_ROUTINE参数,以便获取有关文件复制进度的通知.
我的问题是,匿名代表是否需要固定以及为什么(或为什么不).
此外,如果:
谢谢!
我正试图为Windows 10应用程序获得一个可理解的"进程名称".目前,所有的人使用ApplicationFrameHost
,所以我想我可以请使用ModelId
或PackageName
,但它似乎视窗10店应用程序(我试过Mail
,Store
和Edge
)将不会与工作包查询API
使用kernel32.dll
,GetApplicationUserModelId
返回APPMODEL_ERROR_NO_APPLICATION
和GetPackageId
返回APPMODEL_ERROR_NO_PACKAGE
.
如何获取Windows 10商店应用程序的标识符,以便我可以唯一标识Edge,以及任何其他Windows 10商店应用程序?
我从hWnd
(窗口句柄)获取进程ID ,所以我认为我的问题实际上是如何从窗口句柄获取"真正的"进程ID.从那里,使用这些方法可能会奏效.