精华内容
下载资源
问答
  • 我的一个程序对系统中活跃的进程进行追踪记录,记录数据有两项:进程名称和完整路径 之前我假定PID总是在0到65536之间,所以使用了如下的结构...所以问题来了:请问一个进程的PID到底取决于什么,它的范围是什么呢?
  • Windows进程句柄表

    2020-12-12 16:40:10
    1 Windows进程句柄表 句柄是一个对象引用,同一个对象在不同环境下可能有不同引用(句柄)值。句柄仅在一个进程范围内有效。 HANDLE_TABLE 结构定义: typedef struct _HANDLE_TABLE { ULONG_PTR ...

    1  Windows进程中的句柄表

    句柄是一个对象引用,同一个对象在不同的环境下可能有不同的引用(句柄)值。句柄仅在一个进程范围内有效。

    HANDLE_TABLE 结构的定义:

    typedef struct _HANDLE_TABLE {

        ULONG_PTR TableCode;//指向句柄表的存储结构

        struct _EPROCESS *QuotaProcess;//句柄表的内存资源记录在此进程中

        HANDLE UniqueProcessId;//创建进程的ID,用于回调函数

        #define HANDLE_TABLE_LOCKS 4

        EX_PUSH_LOCK HandleTableLock[HANDLE_TABLE_LOCKS];//句柄表锁,仅在句柄表扩展时使用

        LIST_ENTRY HandleTableList;//所有的句柄表形成一个链表

        EX_PUSH_LOCK HandleContentionEvent;//链表投为全局变量HandleTableListHead

        PHANDLE_TRACE_DEBUG_INFO DebugInfo;//调试信息,仅当调试句柄时才有意义

        LONG ExtraInfoPages;//审计信息所占用的页面数量

        ULONG FirstFree;//空闲链表表头的句柄索引

        ULONG LastFree;//最近被释放的句柄索引,用于FIFO类型空闲链表

        ULONG NextHandleNeedingPool;//下一次句柄表扩展的起始句柄索引

        LONG HandleCount;//正在使用的句柄表项的数量

        union {

            ULONG Flags;//标志域/

            // For optimization we reuse handle values quickly. This can be a problem for

            // some usages of handles and makes debugging a little harder. If this

            // bit is set then we always use FIFO handle allocation.

            BOOLEAN StrictFIFO : 1;//是否使用FIFO风格的重用,即先释放先重用

        };

    } HANDLE_TABLE, *PHANDLE_TABLE;

    TableCode : 指向句柄表的最高层表项页面,低2位的值表示当前句柄表的层数。

    如果最低2位为0,说明句柄表只有1层,最多能容纳512个句柄。

    如果最低2位为1,说明句柄表有2层,最多能容纳512*1024个句柄。

    如果最低2位为2,说明句柄表有3层,最多能容纳512*1024*1024个句柄。

    Windows 进程的句柄表结构

    执行体在创建进程时,首先为新进程分配一个单层句柄表。由ExCreateHandleTable 函数来完成,该函数调用ExpAllocateHandleTable 来构造初始的句柄表。由函数

    ExpAllocateHandleTableEntryShow 来扩展句柄表。代码见base\ntos\ex\handle.c.

    FirstFree : 记录了当前句柄表中的空闲句柄链。通过句柄索引值来链接。

    HANDLE_TABLE_ENTRY 结构定义如下:

    typedef struct _HANDLE_TABLE_ENTRY {

        union {

            PVOID Object;

            ULONG ObAttributes;

            PHANDLE_TABLE_ENTRY_INFO InfoTable;

            ULONG_PTR Value;

        };

        union {

            union {

                ACCESS_MASK GrantedAccess;

                struct {

                    USHORT GrantedAccessIndex;

                    USHORT CreatorBackTraceIndex;

                };

            };

            LONG NextFreeTableEntry;

        };

    } HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;

    Object : 指向句柄所代表的内核对象,最低3位含义:第0 位OBJ_PROTECT_CLOSE,表示调用者是否允许关闭该句柄;第1位OBJ_INHERIT,指示该进程所创建的子进程是否可以继承该句柄,即是否将该句柄项拷贝到它们的句柄表中;第2位OBJ_AUDIT_OBJECT_CLOSE,指示关闭该对象时是否产生一个审计事件

    第二个union中,如果句柄表项指向一个有效的对象,则GrantedAccess 记录了该句柄的访问掩码;如果这是一个空闲的句柄表项,则NextFreeTableEntry 将加入到句柄表的空闲单链表中。

    一个有效的句柄有4中可能:-1,表示当前进程;-2表示当前线程;负值,其绝对值为内核句柄表中的索引;不超过226的正值,当前进程的句柄表中的索引。

    内核句柄表即系统的全局句柄表,wrk 中即变量ObpKernelHandleTable,也是System 进程的句柄表。解析句柄函数ObReferenceObjectByHandle,见base\ntos\ob\obref.c 。

    将一个对象插入到句柄表中的函数是ObInsertObject,见base\ntos\ob\obinsert.c 。

    对象的引用有两种,一种在内核中之间通过对象地址来引用,通过ObReferenceObjectByPoint记录一次新的引用,第二种,通过句柄来引用对象,通过ObpIncrementHandleCount检查并记录一次句柄引用。

    在一个句柄上调用了ObReferenceObjectByHandle后,若该对象不在使用,必须调用ObDereferenceObject 函数。

    进程唯一ID,即UniqueProcessId;线程有一个CLIENT_ID成员Cid,包含了所属进程的唯一ID和线程的唯一ID。

    展开全文
  • 从线程ID获取线程名称通常方法是,先获取该线程入口地址,然后枚举进程内所有已加载模块,最后判断线程入口地址落在哪个加载模块范围内。枚举进程内已加载模块可用Win32标准CreateToolhelp32Snapshot/...

    在一个线程出现异常行为时,比如说CPU占用率过高,抛出异常等,你一定想知道这个线程是由哪个模块创建的。因此无论在哪个操作系统上,获取线程名称是诊断线程相关问题的重要一步。
    从线程ID获取线程名称通常的方法是,先获取该线程的入口地址,然后枚举进程内所有已加载模块,最后判断线程入口地址落在哪个加载模块范围内。枚举进程内已加载模块可用Win32标准的CreateToolhelp32Snapshot/Module32First/Module32Next系列ToolHelp API得到。获取线程入口地址则没有线程的Win32 API可用。不过在Windows NT based操作系统上(包括Windows NT 4.0/2000/XP/2003,等),有一个未公开的Native API可用:NtQueryInformationThread。其声明如下:

    DWORD WINAPI NtQueryInformationThread(
                    HANDLE ThreadHandle,
                    THREAD_INFORMATION_CLASS ThreadInformationClass,
                    PVOID ThreadInformation,
                    ULONG ThreadInformationLength,
                    PULONG ReturnLength
                    );
    获取线程入口地址可用:


    DWORD GetThreadStartAddress(DWORD dwThreadId)
    ...{
        HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, dwThreadId);
        DWORD retaddr, len, error;
        retaddr = len = 0;
        error = NtQueryInformationThread( hThread, 9, &retaddr, sizeof(retaddr), &len );
        CloseHandle(hThread);
        if( error != 0 )
            retaddr = 0;
        return retaddr;
    }
    在Windows CE上就没这么幸运了,没有任何现成的API可用。官方Windows CE Base Team的blog对这个问题的回答是可以用Remote Kernel Tracker,不过这需要你build一个特殊的kernel image,enable一些profiler功能-这在显示的问题诊断中显然是不实际的。那么有没有办法不需要什么特殊的配置就可像Windows桌面操作系统那样获得入口地址呢?有是有的,不过需要一些hack手段。仔细研究CE下的Thread内核数据结构,就会发现Thread结构中有一项是记录线程入口地址的。

    typedef struct Thread ...{
        DWORD _1[3];
        PPROCESS pProc; /**//* 0C: pointer to current process */
        PPROCESS pOwnerProc; /**//* 10: pointer to owner process */
        DWORD _2[18];
        DWORD dwStartAddr; /**//* 5c: thread PC at creation, used to get thread name */
        DWORD _3[10];
    }THREAD, *PTHREAD; /**//* Thread */
    因此要做的就是想办法根据线程ID或handle得到这个数据。再研究,发现线程的Thread内核数据结构可通过句柄得到:


    PTHREAD pTh = HandleToThread(ThreadHandle);
    而且,在Windows CE下,线程ID和其handle的值是一样的!!因此我们可以写一个这样的函数从线程ID拿到入口地址:


    DWORD GetThreadStartAddress(DWORD dwThreadId)
    ...{
        DWORD dwStartAddress = 0;
        BOOL fOldMode = SetKMode(TRUE);
        PTHREAD pTh = HandleToThread((HANDLE)dwThreadId);
        if (pTh)
        ...{
            dwStartAddress = (DWORD)MapPtrToProcess((LPVOID)pTh->dwStartAddr, pTh->pOwnerProc->hProc);
        }
        return dwStartAddress;
    }
    为了使用这些内核数据结构,我们还需要另外一些辅助结构和函数,比较完整的代码如下。当然,官方肯定是不建议这么做的,但是重要的是解决问题,你说呢。

    typedef struct Process ...{
        DWORD _1[2];
        HANDLE hProc; /**//* 08: handle for this process, needed only for SC_GetProcFromPtr */
    }PROCESS, *PPROCESS;
    typedef struct Thread ...{
        DWORD _1[3];
        PPROCESS pProc; /**//* 0C: pointer to current process */
        PPROCESS pOwnerProc; /**//* 10: pointer to owner process */
        DWORD _2[18];
        DWORD dwStartAddr; /**//* 5c: thread PC at creation, used to get thread name */
        DWORD _3[10];
    }THREAD, *PTHREAD; /**//* Thread */

    typedef struct cinfo ...{
        char acName[4]; /**//* 00: object type ID string */
        uchar disp; /**//* 04: type of dispatch */
        uchar type; /**//* 05: api handle type */
        ushort cMethods; /**//* 06: # of methods in dispatch table */
        const PFNVOID *ppfnMethods;/**//* 08: ptr to array of methods (in server address space) */
        const DWORD *pdwSig; /**//* 0C: ptr to array of method signatures */
        PPROCESS pServer; /**//* 10: ptr to server process */
    } CINFO; /**//* cinfo */
    typedef CINFO *PCINFO;

    typedef struct _HDATA HDATA, *PHDATA;
    struct _HDATA ...{
        DWORD _1[2]; /**//* 00: links for active handle list */
        HANDLE hValue; /**//* 08: Current value of handle (nonce) */
        DWORD lock; /**//* 0C: access information */
        DWORD ref; /**//* 10: reference information */
        const CINFO *pci; /**//* 14: ptr to object class description structure */
        PVOID pvObj; /**//* 18: ptr to object */
        DWORD dwInfo; /**//* 1C: extra handle info */
    }; /**//* 20: sizeof(HDATA) */

    #ifdef x86
    struct KDataStruct ...{
        LPDWORD lpvTls; /**//* 0x000 Current thread local storage pointer */
        HANDLE ahSys[NUM_SYS_HANDLES]; /**//* 0x004 If this moves, change kapi.h */
        DWORD _1[4];
        ulong handleBase; /**//* 0x094 base address of handle table */
    }; /**//* KDataStruct */
    #endif
    #ifdef ARM
    struct KDataStruct ...{
        LPDWORD lpvTls; /**//* 0x000 Current thread local storage pointer */
        HANDLE ahSys[NUM_SYS_HANDLES]; /**//* 0x004 If this moves, change kapi.h */
        DWORD _1[6];
        ulong handleBase; /**//* 0x09c handle table base address */
    }; /**//* KDataStruct */
    #endif

    #define HandleToThread(h) ((THREAD *)GetObjectPtrByType((h),SH_CURTHREAD))
    #define HANDLE_ADDRESS_MASK 0x1ffffffc

    void h2p(HANDLE h, PHDATA& phdRet)
    ...{
        if ((ulong)h < NUM_SYS_HANDLES+SYS_HANDLE_BASE && (ulong)h >= SYS_HANDLE_BASE)
            h = ((KDataStruct*)PUserKData)->ahSys[(uint)h-SYS_HANDLE_BASE];
        if (h)
        ...{
            phdRet = (PHDATA)(((ulong)h & HANDLE_ADDRESS_MASK) + ((KDataStruct*)PUserKData)->handleBase);
            if (phdRet->hValue != h)
                phdRet = 0;
        }
        else
            phdRet = 0;
    }

    PVOID GetObjectPtrByType(HANDLE h, int type)
    ...{
        PHDATA phd;
        h2p(h, phd);
        return (phd && phd->pci && phd->pci->type==type) ? phd->pvObj : 0;
    }

    extern "C" LPVOID WINAPI MapPtrToProcess(LPVOID lpv, HANDLE hProc);
    extern "C" BOOL WINAPI SetKMode(BOOL fMode);

    DWORD GetThreadStartAddress(DWORD dwThreadId)
    ...{
        DWORD dwStartAddress = 0;
        BOOL fOldMode = SetKMode(TRUE);
        PTHREAD pTh = HandleToThread((HANDLE)dwThreadId);
        if (pTh)
        ...{
            dwStartAddress = (DWORD)MapPtrToProcess((LPVOID)pTh->dwStartAddr, pTh->pOwnerProc->hProc);
        }
        return dwStartAddress;
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/singlerace/archive/2006/11/11/1379453.aspx

    展开全文
  •  0167 无法锁定文件的范围。  0170 所要求的资源正在使用中。  0173 锁定请求对于提供的取消区域不重要。  0174 文件系统不支持到锁定类型的自动更改。  0180 系统检测到错误的区域号码。  0182 ...
  • 线程ID和句柄区别

    2012-04-20 21:44:20
    以下几点是一些总结: ●CreateThread() API 用于创建线程。...●ID是在Windows系统范围内唯一标示Thread。  ●Handle是用来操作Thread,可以有多个,每个HANDLE可以有不同操作权限,在不同进程OpenThre

    以下几点是一些总结:

    ●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。
    ●ID是在Windows系统范围内唯一标示Thread的。   
    ●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程OpenThread得到的值不一样。  
    ●线程的ID是系统全局的,其HANDLE是进程局部的.

    ●此ID只在线程的生存期内有效。

    ●HANDLE是os和client之间用来操作进程和线程一个桥梁,os有一张维护HANDLE的表单,里面大概放置了   HANDLE的引用计数和有关的属性,HANDLE是os标识进程和线程的东西,但是用户也可以用这个来标识进程和线程,对其操作;而ID是os用来标识进程和线程的,并且是全局唯一的,  但用户可以通过这个ID获得进程线程的HANDLE,多次得到的HANDLE并不一定是一样的.HANDLE是内核对象,而ID好像不是,并没有专门创建ID的函数.

    ●ID是CreateThread时操作系统自动生成的。

    ●线程的句柄和id是不同的。  
      在windows系统中,线程的id是唯一对应的,也就是说,如果两个线程返回相同的id,则他们必然是同一线程,反之一定是不同的线程。而线程的句柄并不是线程的唯一标识,线程的句柄只是用来访问该线程的的一个32位值,尽管相同的句柄一定标识同一线程,但同一线程可能拥有两个打开的句柄,因此,不能用句柄来区分两个线程是否是同一线程。 

     

    昨日读了 windows 多线程程序设计. 知道了线程句柄和线程ID的区别.

    线程ID: 我目前已知的有一个用途: 向一个线程投递消息.
    线程句柄: 基本上, 所有操作线程的windowsAPI均使用线程句柄.

    每多一个句柄, 线程对象就多一个引用计数, 当引用计数为0时, 线程对象将被系统回收.
    一个线程对象可以有很多个句柄指向它.

    我们经常看到这样的代码:
     HANDLE hThrd = CreateThread( NULL, 0, HeartBeatThread, NULL, 0, NULL );
     if( hThrd )
     {
      CloseHandle( hThrd );
      hThrd = 0;
     }
    创建一个线程后, 就把该句柄close了. 把该句柄close,会不会导致线程被回收呢?
    答案是:不会
    因为: CreateThread函数创建一个线程后, 系统内部拥有一个该线程的句柄, 同时返回一个句柄给用户.
    所以, 用户关闭了句柄, 线程并不会退出, 直到线程执行结束了, 系统才会把系统的那一个句柄关闭, 这样, 线程对象的资源就别系统撤销了.

    展开全文
  • Windows CE 6.0嵌入式高级编程(中文版)

    热门讨论 2011-09-13 18:14:03
    1.8 Windows Embedded CE功能 1.9 小结 第2章 开发环境和工具 2.1 Windows Embedded CE Platform Builder 2.2 安装Windows Embedded CE 6.0 2.2.1 支持处理器 2.2.2 安装顺序 2.2.3 快速修复工程和更新 2.2.4 ...
  • 系统范围的缓存数据结构 669 针对每个文件缓存数据结构 670 11.5 文件系统接口 674 从缓存中来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读...
  • 系统范围的缓存数据结构 669 针对每个文件缓存数据结构 670 11.5 文件系统接口 674 从缓存中来回拷贝数据 676 通过映射和锁定接口进行缓存 677 通过直接内存访问接口进行缓存 678 11.6 快速I/O 679 11.7 预读...
  • 线程ID与线程句柄有啥不同

    千次阅读 2020-06-24 09:44:12
    线程句柄与线程ID的区别: ●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。 ●ID是在Windows系统...

    当某个程序创建一个线程后,会产生一个线程的句柄,线程的句柄主要用来控制整个线程的运行,例如停止、挂起或设置线程的优先级等操作。

    线程句柄与线程ID的区别:

    ●CreateThread() API 用于创建线程。 API 返回同时线程句柄和线程标识符 (ID)。 线程句柄有完全访问权创建线程对象。 运行线程时线程 ID 唯一标识线程在系统级别。
    ●ID是在Windows系统范围内唯一标示Thread的。
    ●Handle是用来操作Thread的,可以有多个,每个HANDLE可以有不同的操作权限,在不同进程OpenThread得到的值不一样。
    ●线程的ID是系统全局的,其HANDLE是进程局部的.

    ●此ID只在线程的生存期内有效。

    ●HANDLE是os和client之间用来操作进程和线程一个桥梁,os有一张维护HANDLE的表单,里面大概放置了 HANDLE的引用计数和有关的属性,HANDLE是os标识进程和线程的东西,但是用户也可以用这个来标识进程和线程,对其操作;而ID是os用来标识进程和线程的,并且是全局唯一的, 但用户可以通过这个ID获得进程线程的HANDLE,多次得到的HANDLE并不一定是一样的.HANDLE是内核对象,而ID好像不是,并没有专门创建ID的函数.

    ●ID是CreateThread时操作系统自动生成的。

    ●线程的句柄和id是不同的。
    在windows系统中,线程的id是唯一对应的,也就是说,如果两个线程返回相同的id,则他们必然是同一线程,反之一定是不同的线程。而线程的句柄并不是线程的唯一标识,线程的句柄只是用来访问该线程的的一个32位值,尽管相同的句柄一定标识同一线程,但同一线程可能拥有两个打开的句柄,因此,不能用句柄来区分两个线程是否是同一线程。

    什么是句柄:

    句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?
    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。
    句柄地址(稳定)→记载着对象在内存中的地址→对象在内存中的地址(不稳定)→实际对象

    线程与线程句柄的关系:

    句柄可以认为是系统对资源(如线程)的分配的一个编号。关闭这个编号,对于不同的资源,效果不尽相同。对于线程来说,关闭这个编号并不意味着终止线程,只是之后很难再操纵这个线程。

    原文:线程ID与线程句柄区别

    展开全文
  • 以下几点是一些总结: ●CreateThread() API 用于创建线程。...●ID是在Windows系统范围内唯一标示Thread。  ●Handle是用来操作Thread,可以有多个,每个HANDLE可以有不同操作权限,在不同进程OpenTh
  • 以下几点是一些总结:●CreateThread() API 用于创建线程。...●ID是在Windows系统范围内唯一标示Thread。 ●Handle是用来操作Thread,可以有多个,每个HANDLE可以有不同操作权限,在不同进程OpenThread
  • 以下几点是一些总结: ●CreateThread() API 用于创建线程。...●ID是在Windows系统范围内唯一标示Thread。 ●Handle是用来操作Thread,可以有多个,每个HANDLE可以有不同操作权限,在不同进程OpenThre...
  • 它以字节为单位读取进程ID,基址和大小。它返回从目标进程读取字节串。如果allow_partial为false,则整个地址范围必须可读,否则将失败,并显示Windows错误代码ERROR_PARTIAL_COPY。如果allow_partial为真,则返回...
  • 牛人写 samba中文书.pdf

    热门讨论 2009-08-18 23:49:58
    7.4.4. 用户及组ID的分配 7.4.5. 缓存结果 7.5. 安装及配置 7.6. 限制 7.7. 结语 8. UNIX权限位和Windows NT访问控制表 8.1. 用NT安全对话框浏览和修改UNIX权限 8.2. 如何浏览Samba共享项上的文件权限 8.3. ...
  • { 获取外壳进程运行状态,[ctx.Ebx+8]内存处存是外壳进程的加载基址,ctx.Eax存放有外壳进程的入口地址 } ctx.ContextFlags := CONTEXT_FULL; GetThreadContext(ThrdHnd, ctx); ReadProcessMemory(ProcHnd, ...
  • 强大扫描工具x-scan

    2009-11-13 23:17:02
    在“-iis”选项中,新增对IIS “.ida/.idq”漏洞扫描,同时更新漏洞 描述;在“-port”参数中,允许指定扫描端口范围(通过修改“dat\config.ini”文件中“[PORT- LIST]\port=”);在“-ntpass”参数中,允许...
  • GetTabbedTextExtent 判断一个字串占据的范围,同时考虑制表站扩充的因素 GetTextAlign 接收一个设备场景当前的文本对齐标志 GetTextCharacterExtra 判断额外字符间距的当前值 GetTextCharset 接收当前选入指定...
  • CGI程序伸缩性不很理想,因为它为每一个正在运行CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序语言解释器编译进你web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意...
  • 易语言辅助模块

    2013-02-14 19:52:02
    参数 进程ID, 整数型, , 指定进程ID .子程序 取前台窗口句柄, 整数型, 公开, 成功返回(窗口句柄),失败返回(0) .子程序 置窗口标题, 逻辑型, 公开, 成功返回(真),失败返回(假) .参数 窗口句柄, 整数型 .参数 新...
  • 易语言 茶凉专用模块

    2010-05-04 12:26:36
    模块名称:茶凉专用模块 作者:茶凉 版本:2.0 本模块可以编程更简单,仅仅用核心支持库编写。 @备注: ...官方QQ群:92716369 ------------------------ ...参数 进程ID, 整数型, , 进程ID .参数 地址, 整数型, , ...
  • 173 0x000000AD 取消范围的锁定要求不明显。 174 0x000000AE 档案系统不支持自动变更锁定类型。 180 0x000000B4 系统发现不正确区段号码。 182 0x000000B6 操作系统无法执行 %1。 182 0x000000B6 操作系统无法...
  • 8.8.6 返回当前连接会话ID(SPID) 249 8.8.7 返回打开事务数量 249 8.8.8 获取之前语句影响行数 250 8.8.9 获取系统统计信息 250 8.8.10 显示数据库和SQL Server设置 251 8.8.11 返回当前数据库ID...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    因为Linux与Windows不同,其后台运行着许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定状态,甚至在有系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有...
  • IIS6.0 IIS,互联网信息服务

    热门讨论 2010-08-23 21:20:55
    在这里可以管理的范围主要包括对Web站点和FTP站点进行的新建、修改、启动、停止和删除等操作。 [编辑本段]有关IIS的常见问题解答  四、本部分常见问题解答 Q:在上文中所涉及到的网址中,有的加了“http://”,有的...

空空如也

空空如也

1 2 3 4 5
收藏数 94
精华内容 37
关键字:

windows进程id的范围