文件-进程关联演示程序

一个自毁程序 <br />void CTest5App::SelfDelete()<br />{<br /> int i; <br />   HANDLE hFile; <br />   DWORD dwWritten; <br />   char selfpathaaa[MAX_PATH]={0}; <br />   char command[2048]={0}; <br />   char selfpath[MAX_PATH]={0} ;<br />   char name[]="test.bat"; <br />  阅读详情
1、首先使用ZwQuerySystemInformation查询所有进程句柄,
2、获取句柄所代表对象信息,查出目标文件。核心态程序相对简单,对于
用户态程序,使用ZwQueryInformationFile同时与GetFileInformationByHandle、
GetVolumeInformation二API搭配获得之(前者得文件除去卷的路径名,后二者
得卷名);另外可用ZwQueryObject。
3、综合1,2即完成
演示一:
#include <windows.h>
#include <stdio.h>

#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)

typedef LONG  NTSTATUS;
typedef struct _IO_STATUS_BLOCK
{
NTSTATUSStatus;
ULONGInformation;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING
{
USHORTLength;
USHORTMaximumLength;
PWSTRBuffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define OBJ_INHERIT             0x00000002L
#define OBJ_PERMANENT           0x00000010L
#define OBJ_EXCLUSIVE           0x00000020L
#define OBJ_CASE_INSENSITIVE    0x00000040L
#define OBJ_OPENIF              0x00000080L
#define OBJ_OPENLINK            0x00000100L
#define OBJ_KERNEL_HANDLE       0x00000200L
#define OBJ_VALID_ATTRIBUTES    0x000003F2L

typedef struct _OBJECT_ATTRIBUTES
{
   ULONGLength;
   HANDLERootDirectory;
   PUNICODE_STRING ObjectName;
   ULONGAttributes;
   PVOIDSecurityDescriptor;
   PVOIDSecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;  

typedef struct _SYSTEM_HANDLE_INformATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INformATION, *PSYSTEM_HANDLE_INformATION;

typedef struct _FILE_NAME_INformATION {
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAME_INformATION, *PFILE_NAME_INformATION;

typedef NTSTATUS (CALLBACK* ZWQUERYSYSTEMINformATION)(
IN  ULONG SystemInformationClass,
IN  OUT PVOID SystemInformation,
IN  ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);

typedef NTSTATUS (CALLBACK* ZWQUERYINformATIONFILE)(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG FileInformationLength,
IN ULONG FileInformationClass);

ZWQUERYSYSTEMINformATIONZwQuerySystemInformation;
ZWQUERYINformATIONFILE ZwQueryInformationFile;
HMODULEg_hNtDLL = NULL;

BOOL InitNTDLL()
{
g_hNtDLL = LoadLibrary( "ntdll.dll" );
if ( !g_hNtDLL )
{
return FALSE;
}

ZwQuerySystemInformation =
(ZWQUERYSYSTEMINformATION)GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation");

ZwQueryInformationFile =
(ZWQUERYINformATIONFILE)GetProcAddress( g_hNtDLL, "ZwQueryInformationFile");

return TRUE;
}

VOID CloseNTDLL()
{
if(g_hNtDLL != NULL)
{
FreeLibrary(g_hNtDLL);
}
}

PULONG GetHandleList()
{
   ULONG cbBuffer = 0x1000;
   PULONG pBuffer = new ULONG[cbBuffer];
   NTSTATUS Status;
DWORD dwNumBytesRet = 0x10;
   do
   {
       Status = ZwQuerySystemInformation(
                   16,
                   pBuffer,
cbBuffer * sizeof * pBuffer,
&dwNumBytesRet);

       if (Status == STATUS_INFO_LENGTH_MISMATCH)
       {
           delete [] pBuffer;
           pBuffer = new ULONG[cbBuffer *= 2];
       }
       else if (!NT_SUCCESS(Status))
       {
           delete [] pBuffer;
           return NULL;
       }
   }
   while (Status == STATUS_INFO_LENGTH_MISMATCH);
   return pBuffer;
}

HANDLE DupHandle(DWORD PId, HANDLE handle)
{
HANDLE DupHandle;
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, 0, PId);
if(hProcess == NULL)
{
return 0;
}

   if (!DuplicateHandle(hProcess, handle, GetCurrentProcess(), &DupHandle, 0, 0, 2))
DupHandle = 0;

CloseHandle( hProcess );

return DupHandle;
}

DWORD Volumeserial[26];

void InitVolumeName()
{
DWORD disk = GetLogicalDrives();
for (int i=0; i<26; i++)
{
if (disk&(1<<i))
{
char str[] = "A://";
str[0] += i;
GetVolumeInformation(str, NULL, 0, &Volumeserial[i], 0, 0, 0, 0);
}
}
}

wchar_t GetVolumeName(HANDLE hFile)
{
BY_HANDLE_FILE_INformATION info;
if (GetFileInformationByHandle(hFile, &info))
{
for (int i=0; i<26; i++)
if (info.dwVolumeSerialNumber == Volumeserial[i])
return L'A'+i;
}

return L'!';
}

int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("QueryProc filename/n");
exit(1);
}

wchar_t filename[1000];
int num = MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,argv[1],strlen(argv[1]),filename,1000);
filename[num] = 0;

printf("begin:/n");

InitNTDLL();

InitVolumeName();

char namebuf[2000];

HANDLE hTmp;
GetModuleFileName(NULL,namebuf,MAX_PATH);
hTmp = CreateFile(namebuf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

PULONG buf = GetHandleList();
if (buf == NULL)
exit(1);

ULONG i;
UCHAR TypeNum;
PSYSTEM_HANDLE_INformATION info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (GetCurrentProcessId() == info->ProcessId && info->Handle == (USHORT)hTmp)
TypeNum = info->ObjectTypeNumber;
}
CloseHandle(hTmp);

info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (info->ObjectTypeNumber != TypeNum)
continue;
HANDLE handle = DupHandle(info->ProcessId, (HANDLE)info->Handle);
NTSTATUS status;
IO_STATUS_BLOCK ios;
PFILE_NAME_INformATION name = (PFILE_NAME_INformATION)namebuf;
ZeroMemory(name, 2000);
status = ZwQueryInformationFile(handle, &ios, namebuf, 2000, 9);
if (status >= 0)
{
wchar_t volume = GetVolumeName(handle);
if (volume != L'!')
{
wchar_t outstr[1000] = L"A:";
outstr[0] = volume;
memcpy(&outstr[2], name->FileName, name->FileNameLength);
outstr[2+name->FileNameLength] = 0;
#if 0
printf("%ws/n", outstr);
#endif
if (wcsicmp(outstr, filename) == 0)
{
printf("%ws/nProcessId:%d/n", outstr, info->ProcessId);
}
}
}
CloseHandle(handle);
}
delete [] buf;

CloseNTDLL();

return 0;
}


演示二:

#include <windows.h>
#include <stdio.h>

#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)
#define STATUS_INFO_LENGTH_MISMATCH((NTSTATUS)0xC0000004L)
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)

typedef LONG  NTSTATUS;
typedef struct _IO_STATUS_BLOCK
{
NTSTATUSStatus;
ULONGInformation;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;

typedef struct _UNICODE_STRING
{
USHORTLength;
USHORTMaximumLength;
PWSTRBuffer;
} UNICODE_STRING, *PUNICODE_STRING;

#define OBJ_INHERIT             0x00000002L
#define OBJ_PERMANENT           0x00000010L
#define OBJ_EXCLUSIVE           0x00000020L
#define OBJ_CASE_INSENSITIVE    0x00000040L
#define OBJ_OPENIF              0x00000080L
#define OBJ_OPENLINK            0x00000100L
#define OBJ_KERNEL_HANDLE       0x00000200L
#define OBJ_VALID_ATTRIBUTES    0x000003F2L

typedef struct _OBJECT_ATTRIBUTES
{
   ULONGLength;
   HANDLERootDirectory;
   PUNICODE_STRING ObjectName;
   ULONGAttributes;
   PVOIDSecurityDescriptor;
   PVOIDSecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;  

typedef struct _SYSTEM_HANDLE_INformATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INformATION, *PSYSTEM_HANDLE_INformATION;

typedef struct _OBJECT_NAME_INformATION {
UNICODE_STRING Name;
} OBJECT_NAME_INformATION, *POBJECT_NAME_INformATION;

typedef NTSTATUS (CALLBACK* ZWQUERYSYSTEMINformATION)(
IN  ULONG SystemInformationClass,
IN  OUT PVOID SystemInformation,
IN  ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL);

typedef NTSTATUS (CALLBACK* ZWOPENFILE)(
OUT PHANDLE FileHandle,
IN  ACCESS_MASK DesiredAccess,
IN  POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN  ULONG ShareAccess,
IN  ULONG OpenOptions
);

typedef NTSTATUS (CALLBACK* ZWQUERYOBJECT)(
IN HANDLE ObjectHandle,
IN ULONG ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

ZWQUERYSYSTEMINformATIONZwQuerySystemInformation;
ZWQUERYOBJECT ZwQueryObject;
HMODULEg_hNtDLL = NULL;

BOOL InitNTDLL()
{
g_hNtDLL = LoadLibrary( "ntdll.dll" );
if ( !g_hNtDLL )
{
return FALSE;
}

ZwQuerySystemInformation =
(ZWQUERYSYSTEMINformATION)GetProcAddress( g_hNtDLL, "ZwQuerySystemInformation");

ZwQueryObject =
(ZWQUERYOBJECT)GetProcAddress( g_hNtDLL, "ZwQueryObject");

return TRUE;
}

VOID CloseNTDLL()
{
if(g_hNtDLL != NULL)
{
FreeLibrary(g_hNtDLL);
}
}

PULONG GetHandleList()
{
   ULONG cbBuffer = 0x1000;
   PULONG pBuffer = new ULONG[cbBuffer];
   NTSTATUS Status;
DWORD dwNumBytesRet = 0x10;
   do
   {
       Status = ZwQuerySystemInformation(
                   16,
                   pBuffer,
cbBuffer * sizeof * pBuffer,
&dwNumBytesRet);

       if (Status == STATUS_INFO_LENGTH_MISMATCH)
       {
           delete [] pBuffer;
           pBuffer = new ULONG[cbBuffer *= 2];
       }
       else if (!NT_SUCCESS(Status))
       {
           delete [] pBuffer;
           return NULL;
       }
   }
   while (Status == STATUS_INFO_LENGTH_MISMATCH);
   return pBuffer;
}

HANDLE DupHandle(DWORD PId, HANDLE handle)
{
HANDLE DupHandle;
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, 0, PId);
if(hProcess == NULL)
{
return 0;
}

   if (!DuplicateHandle(hProcess, handle, GetCurrentProcess(), &DupHandle, 0, 0, 2))
DupHandle = 0;

CloseHandle( hProcess );

return DupHandle;
}

int main(int argc, char *argv[])
{
if (argc < 2)
{
printf("QueryProc filename/n");
exit(1);
}

wchar_t filename[1000];
int num = MultiByteToWideChar(CP_OEMCP,MB_PRECOMPOSED,argv[1],strlen(argv[1]),filename,1000);
filename[num] = 0;

printf("begin:/n");

InitNTDLL();

char namebuf[2000];
DWORD ret;

HANDLE hTmp;
GetModuleFileName(NULL,namebuf,MAX_PATH);
hTmp = CreateFile(namebuf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

PULONG buf = GetHandleList();
if (buf == NULL)
exit(1);

ULONG i;
UCHAR TypeNum;
PSYSTEM_HANDLE_INformATION info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (GetCurrentProcessId() == info->ProcessId && info->Handle == (USHORT)hTmp)
TypeNum = info->ObjectTypeNumber;
}
CloseHandle(hTmp);

info = (PSYSTEM_HANDLE_INformATION)&buf[1];
for (i=0; i<buf[0]; i++, info++)
{
if (info->ObjectTypeNumber != TypeNum)
continue;
HANDLE handle = DupHandle(info->ProcessId, (HANDLE)info->Handle);
NTSTATUS status;
POBJECT_NAME_INformATION name = (POBJECT_NAME_INformATION)namebuf;
status = ZwQueryObject(handle, 1, namebuf, 2000, &ret);
if (status >= 0)
{
#if 0
printf("%ws/n",name->Name.Buffer);
#endif
wchar_t outstr[1000] = L"A:";
if (name->Name.Length > 23 && memicmp(name->Name.Buffer, L"//Device//HardDiskVolume", 44) == 0)
{
outstr[0] = name->Name.Buffer[22] - L'1' + L'C';
memcpy(&outstr[2], &name->Name.Buffer[23], name->Name.Length-23*2);
outstr[name->Name.Length/2-21] = 0;
}
if (wcsicmp(outstr, filename) == 0)
{
printf("%ws/nProcessId:%d/n", outstr, info->ProcessId);
}
}
CloseHandle(handle);
}
delete [] buf;

CloseNTDLL();

return 0;
}
 
 
【升级】易语言文件解锁(关闭句柄法)-易语言 前言 上一次发布过的程序:【首发】检测文件的占用,具有学习和商业价值(By超级用户),可以使用,仿电脑管家 正文 对于怎么枚举文件句柄 ,上一帖子对此有介绍,核心代码大概如下:如果 (ZwQueryObject (handle, #ObjectTypeInformation, unicode, 0, size) ≠ #STATUS_INVALID_HANDLE )' 只要不是无效的,为什么,详细看下面的注释 ' 参数 ' Handle ' 对象的一个句柄来获取信息。 ' ObjectInformationClass ' 指定一个OBJECT_INFORMATION_CLASS返回值的类型决定了信息在ObjectInformation缓冲区。 ' ObjectInformation ' 一个指向caller-allocated缓冲接收请求的信息。 ' ObjectInformationLength ' 指定的大小,以字节为单位,ObjectInformation缓冲区。 ' ReturnLength ' 一个指向变量的指针,接收的大小,以字节为单位,请求的关键信息。如果NtQueryObject STATUS_SUCCESS返回,返回的变量包含的数据量。如果NtQueryObject返回STATUS_BUFFER_OVERFLOW或STATUS_BUFFER_TOO_SMALL,您可以使用变量的值来确定所需的缓冲区大小。 ' 返回值 ' NtQueryObject返回STATUS_SUCCESS或适当的错误状态。可能的错误状态码包括以下: ' 返回代码 描述 ' STATUS_ACCESS_DENIED ' 有足够的权限来执行该cha询。 ' STATUS_INVALID_HANDLE ' 提供对象句柄无效。 ' STATUS_INFO_LENGTH_MISMATCH ' 信息长度不足以容纳数据。 unicode = 取空白字节集 (size) ZwQueryObject (handle, #ObjectTypeInformation, unicode, size, 0)' 读取信息的unicode文本 RtlUnicodeStringToAnsiString (ansi, unicode, 真)' 编码转换 ' RtlUnicodeStringToAnsiString例程将给定Unicode字符串转换成一个ANSI字符串。 str = 指针到文本 (ansi.Buffer) ' RtlFreeAnsiString常规版本存储由RtlUnicodeStringToAnsiString分配。 ' 参数 ' AnsiString ' 指针ANSI字符串缓冲区由RtlUnicodeStringToAnsiString以前分配的。 RtlFreeAnsiString (ansi) str = “无法获取”' 无效的怎么获取…… 返回 (str) 这一次呢更新了一个RemoteCloseHandle ,大概的原理是什么呢? 同时也采用了一些比较骚的方法,这种方法的限制较多,但是对于32位进程就很有效果。 NtClose在MSDN的大概介绍 1. NtClose is a generic routine that operates on any type of object. 2. Closing an open object handle causes that handle to become invalid. The system also decrements the handle count for the object and checks whether the object can be deleted. The system does not actually delete the object until all of the object's handles are closed and no referenced pointers remain. 3. A driver must close every handle that it opens as soon as the handle is no longer required. Kernel handles, which are those that are opened by a system thread or by specifying the OBJ_KERNEL_HANDLE flag, can be closed only when the previous processor mo 立即下载

相关推荐

易语言根据文件句柄取文件路径

易语言根据文件句柄取文件路径源码,根据文件句柄取文件路径,文件句柄取文件路径名,lopen,ZwQueryObject,WToM,lclose,QueryDosDevice,StrCmpNI

R3下用ZwQueryObject/ZwDuplicateObject关闭互斥体和解除文件占用

不少程序在运行时会创建/打开全局Mutex,来限制用户多开。百度上搜一圈下来,他们的实现基本是这样: int main(int argc, char* argv[]) { HANDLE hMtx = CreateMutex(NULL,false,"process"); //创建一个有名对象,可以在其他进程中访问 if(GetLastError() == ERROR_ALREADY_EXIS

lixiangminghate的专栏 8224

详解在linux上安装vpn客户端

详解在linux上安装vpn客户端

FuncPlotCalc 8433

R3 x64枚举进程句柄

转载:https://blog.youkuaiyun.com/zhuhuibeishadiao/article/details/51292608 需要注意的是:在R3使用ZwQueryObject很容易锁死,需要放到线程中,如果线程超过500ms就说明卡死了 就只能放弃这个句柄了 这个句柄外面是一个FileObject类型,但真实是一个信号类型 还有在R3中枚举 有一个句柄我们是没有权限...

476

SFR算法实现详解:从边缘检测到MTF计算的完整流程

本文详细解析了SFR算法从边缘检测到MTF计算的完整流程,包括边缘检测、ESF超采样、LSF差分等关键步骤。通过代码示例和实战经验,帮助开发者高效实现成像系统解析力评估,优化MTF测量精度。适用于摄像头模组调试、工业检测等场景。

Black的专栏 1010

贝叶斯校准在计算机模型不确定性分析中的实践指南

本文深入探讨了贝叶斯校准在计算机模型不确定性分析中的核心原理与实践方法。通过将模型从“黑箱”转变为“透明箱”,该方法系统量化了参数不确定性、模型结构缺陷及观测误差。文章重点阐释了如何利用高斯过程作为代理模型和模型不足函数,构建完整的贝叶斯校准框架,并提供了从数据准备、模型训练到MCMC推断及不确定性分析的实战指南,最终实现更可靠的预测与决策支持。

weixin_29088655的博客 292

ZwQueryObject引起的OD无响应

最近在使用OD调试一个程序的时候经常遇到OD无响应,查看无响应时的堆栈发现OD在调用ZwQueryObject时阻塞了,根据参数可知是是在查询一个文件的ObjectNameInformation,不清楚OD为什么要做这个操作,直接Patch掉OD的这段代码,竟然就正常了。 ...

天道酬勤 911

有限元中的对称魔法:用1/6模型算整个涡轮叶片(含MATLAB代码)

本文深入解析了有限元分析中针对循环对称结构的高效求解策略。通过利用涡轮叶片等结构的几何重复性,仅需对1/6基本扇区建模并施加循环对称条件,即可精确推演整体力学行为,大幅降低计算规模。文章从数学原理推导到MATLAB代码实现,提供了完整的实战指南,适用于旋转机械的静力、模态及谐响应分析。

fire9的博客 312

文件-进程关联演示程序(出自CVC)

文件-进程关联演示程序(出自CVC)1、首先使用ZwQuerySystemInformation查询所有进程句柄,2、获取句柄所代表对象信息,查出目标文件。核心态程序相对简单,对于用户态程序,使用ZwQueryInformationFile同时与GetFileInformationByHandle、GetVolumeInformation二API搭配获得之(前者得文件除去卷的路径名,后二者得卷名)

723

亿图图示(edrawmax中文版) v10.1.7pjb

edrawmax中文名叫做亿图图示,是一款非常棒的综合图形图表设计软件,既能实现流程图、架构图、工程图、思维导图等数百种专业领域图形图表的绘制,又能提供一个白板进行头脑风暴和任意编排,轻松实现数据和创意的可视化呈现。软件支持Windows、Mac、Linux及网络版,一端创作,多端同步,从而为跨端办公绘图提供新的解决方案,还兼容常用文档类的办公软件格式,包括图片、Office、PDF、Visio、Html、SVG等,尽可能的在文件格式这块满足用户多方面需求。软件支持创建260多种图表类型,拥有超过12500

qq_43293214的博客 1万+

2025反爬虫革命:京东商品接口的动态指纹认证与量子加密传输方案

在2025年,全球电商API接口面临的安全威胁呈现指数级增长:京东构建了基于硬件、软件、行为三重维度的设备指纹模型:京东构建了基于BB84+E91混合协议的量子密钥中继网络:

FB13713612741的博客 1649

实验四 理解程序、进程、线程及利用Windows注册表完成相应操作

实验目的理解程序、进程、线程的含义以及关系。2、学习和掌握利用Windows注册表完成任意程序的多种自启动。3、学习和掌握利用Windows注册表修改常见的文件类型的关联方式。4、学习和掌握利用Windows注册表完成镜像劫持操作。实验环境操作环境:Windows7实验工具:cmd、regedit实验原理通过自启动机制,应用程序、内核驱动或系统服务在Windows系统启动时能自行完成自身启动。病毒除利用注册表完成自启动之外,还可利用文件类型关联程序完成隐匿自启动。新建一个以杀毒软件主程序命名的项,例如Win

m0_56948411的博客 1045

从菜鸟到大神:VSCode助力HTML开发全攻略

本文全面介绍 VSCode 在 HTML 开发中的高效应用。先引导读者完成 VSCode 的安装与个性化设置,助其快速适应开发环境;接着推荐 Live Server、Prettier 等实用插件,实现实时预览、代码格式化等功能,提升开发效率。通过详细的开发实战步骤,从新建文件到添加样式,带领读者掌握 HTML 基础结构与常用标签使用。还分享代码片段管理、多人协作等进阶技巧,解决常见开发问题。旨在帮助开发者利用 VSCode,轻松高效完成 HTML 开发,打造优质网页。

邓邓子的博客 3369

linux进程与它的文件描述符1

一)概述  .open系统调用返回的文件描述符是非负整型.  .每一个进程都有自己的文件描述符集合.  .当创建进程时,通常有3个打开文件描述符(0,1,2),0代表标准输入,1代表标准输出,2代表标准错误,它们统称为标准IO.  .当多个描述符指向同一个文件,每个文件描述符仍保持他独特的性能.  .由于文件描述符在一个进程中是特有的,因此不能在多个进程中间实现共享,而唯一的...

weixin_34232617的博客 150

UG\NX二次开发 使用UF_CURVE_create_ocf_feature函数创建“在面上偏置”特征

使用UF_CURVE_create_ocf_feature函数创建“在面上偏置”特征。

王牌飞行员_里海的博客 850

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

python os open_Python os.tcsetpgrp() 方法

Python os.tcsetpgrp() 方法概述os.tcsetpgrp() 方法用于设置与终端fd(一个由os.open()返回的打开的文件描述符)关联的进程组为pg。语法tcsetpgrp()方法语法格式如下:os.tcsetpgrp(fd, pg)参数fd -- 文件描述符。pg -- 关联的进程组。返回值该方法没有返回值。实例以下实例演示了 tcsetpgrp() 方法的使用:#!/u...

weixin_39828198的博客 84

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【linux 多进程并发】0202 Linux进程fork之后父子进程间的文件操作有着相同的偏移记录,多进程操作文件的方法

好了,到这里,子进程是父进程的拷贝有了更加深入的理解,这里像编程语言中的深拷贝与浅拷贝的关系。 而子进程其实是做了一些浅拷贝,引用的内核文件表项还是一份,这就会引起两个进程共同操作的问题。 在这种情况下,每次操作需要加锁,同时要指定操作的位置和大小。

一个追逐梦想的码农 2643

进程-端口-IP地址关联演示

这篇文章是我看了一篇VC的文章增加修改而来,原文章地址我也忘记了,作者也不是很清楚,在这里希望原作者能原谅. 此代码演示了进程和端口以及IP地址的关联,程序使用了ZwQuerySystemInformation函数来枚举所有打开的句柄然后再使用ZwQueryObject函数来获取句柄所对应的路径,如果发现路径正包含/device/rawip或者/device/tcp或者/device/udp即

chenhui530的专栏 9295

linux 文件监控 关联 程序,Linux下的文件关联

根据 MIME 类型关联① 查看文件 MIME 类型xdg-mimequeryfiletype#或者mimetype#或者file-i② 查询打开某类文件的默认程序giomime#或者xdg-mimequerydefault③ 设置打开某类文件的默认程序giomime#或者mimeopen-d#或者xdg-mimedefault④ 使用示例choi@...

weixin_30471581的博客 422

进程间数据的关联与隔离

进程控制涉及进程的生命周期管理及数据关联与隔离。进程控制块(PCB)存储进程关键信息,是实现进程管理的核心。父子进程通过fork()创建时,采用写时复制技术共享内存数据,但修改后相互独立,而文件描述符等资源则直接共享。进程终止时,PCB保留退出状态供父进程回收。特殊进程如僵尸进程和孤儿进程涉及不同数据残留与接管机制。进程间数据关系以隔离为主、按需共享,理解这些机制对设计多进程程序至关重要。

herderl的博客 695

程序,进程,线程

进程是一个动态实体,不同之间相互独立,都有单独的地址空间,除非通过特定的进程间的通信机制,否则不能随意访问另一个进程数据,具有独立性。用户级线程:由用户程序通过线程库实现,所有的线程管理工作都有应用程序负责,线程切换在用户态下即可完成,无需操作系统干预,即“从用户视角看能看到的线程”。一个进程可以包含多个线程,共享进程的资源,每个线程有自己的程序计数器、栈和局部变量,但不具有独立的内存空间。在计算机系统的运行过程中,程序是基础,进程是程序执行的载体,而线程则是进一步提高程序执行效率和并发能力的手段。

Niangaogaogaogao的博客 1583

制造恶作剧切断TCP连接和进程之间的关联

想不想再玩个恶作剧?? 很多运维发现系统中有tcp连接异常的时候,会使用netstat/ss命令找出tcp连接对应的处理进程,然后去找研发debug这个进程。比如: [root@localhost ~]# netstat -ntp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name t

TCP/IP 1万+
上一篇: 获得指定 PID 的进程可执行文件全路径
下一篇: EP_X0FF进程填零的C代码版
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值