鄙视老迈,鄙视小兵

cpponduty 2006-11-15 10:44:00
你们抢吧
...全文
166 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lexchou 2006-11-15
  • 打赏
  • 举报
回复

PRTL_HANDLE_TABLE_ENTRY
RtlAllocateHandle(
IN PRTL_HANDLE_TABLE HandleTable,
OUT PULONG HandleIndex OPTIONAL
)
{
NTSTATUS Status;
PVOID BaseAddress;
ULONG n;
SIZE_T ReserveSize;
SIZE_T CommitSize;
PRTL_HANDLE_TABLE_ENTRY p, *pp;

if (HandleTable->FreeHandles == NULL) {
try {
if (HandleTable->UnCommittedHandles == NULL) {
ReserveSize = HandleTable->MaximumNumberOfHandles *
HandleTable->SizeOfHandleTableEntry;
BaseAddress = NULL;
Status = NtAllocateVirtualMemory( NtCurrentProcess(),
&BaseAddress,
0,
&ReserveSize,
MEM_RESERVE,
PAGE_READWRITE
);

if (NT_SUCCESS( Status )) {
HandleTable->CommittedHandles = (PRTL_HANDLE_TABLE_ENTRY)BaseAddress;
HandleTable->UnCommittedHandles = (PRTL_HANDLE_TABLE_ENTRY)BaseAddress;
HandleTable->MaxReservedHandles = (PRTL_HANDLE_TABLE_ENTRY)
((PCHAR)BaseAddress + ReserveSize);
}
}
else {
Status = STATUS_SUCCESS;
}


if (NT_SUCCESS( Status )) {
p = HandleTable->UnCommittedHandles;
if (p >= HandleTable->MaxReservedHandles) {
Status = STATUS_NO_MEMORY;
}
else {
CommitSize = PAGE_SIZE;
Status = NtAllocateVirtualMemory( NtCurrentProcess(),
(PVOID *)&p,
0,
&CommitSize,
MEM_COMMIT,
PAGE_READWRITE
);
if (NT_SUCCESS( Status )) {
HandleTable->UnCommittedHandles = (PRTL_HANDLE_TABLE_ENTRY)
((PCH)p + CommitSize);
}
}
}

}
except( EXCEPTION_EXECUTE_HANDLER ) {
Status = GetExceptionCode();
}

if (!NT_SUCCESS( Status )) {
return NULL;
}

pp = &HandleTable->FreeHandles;
while (p < HandleTable->UnCommittedHandles) {
*pp = p;
pp = &p->NextFree;
p = (PRTL_HANDLE_TABLE_ENTRY)((PUCHAR)p + HandleTable->SizeOfHandleTableEntry);
}
}

//
// Remove handle table entry from head of free list.
//

p = HandleTable->FreeHandles;
HandleTable->FreeHandles = p->NextFree;

//
// Clear free list link field, which also leaves the handle allocated bit
// clear. This allows the caller to mark it is allocated after they are
// done filling in their portion.
//

p->NextFree = NULL;


//
// If requested, return the index of this handle table entry
//
if (ARGUMENT_PRESENT( HandleIndex )) {
*HandleIndex = (ULONG) (((PCHAR)p - (PCHAR)HandleTable->CommittedHandles) /
HandleTable->SizeOfHandleTableEntry);
}

//
// Return a pointer to the handle table entry.
//

return p;
}


BOOLEAN
RtlFreeHandle(
IN PRTL_HANDLE_TABLE HandleTable,
IN PRTL_HANDLE_TABLE_ENTRY Handle
)
{
#if DBG
if (!RtlIsValidHandle( HandleTable, Handle )) {
DbgPrint( "RTL: RtlFreeHandle( %lx ) - invalid handle\n", Handle );
if (NtCurrentPeb()->BeingDebugged) {
DbgBreakPoint();
}
return FALSE;
}
#endif

RtlZeroMemory( Handle, HandleTable->SizeOfHandleTableEntry );
Handle->NextFree = HandleTable->FreeHandles;
HandleTable->FreeHandles = Handle;
return TRUE;
}



BOOLEAN
RtlIsValidHandle(
IN PRTL_HANDLE_TABLE HandleTable,
IN PRTL_HANDLE_TABLE_ENTRY Handle
)
{
if (Handle == NULL ||
Handle < HandleTable->CommittedHandles ||
Handle >= HandleTable->UnCommittedHandles ||
(ULONG_PTR)Handle & (HandleTable->SizeOfHandleTableEntry - 1) ||
!(Handle->Flags & RTL_HANDLE_ALLOCATED)
) {
return FALSE;
}
else {
return TRUE;
}
}


BOOLEAN
RtlIsValidIndexHandle(
IN PRTL_HANDLE_TABLE HandleTable,
IN ULONG HandleIndex,
OUT PRTL_HANDLE_TABLE_ENTRY *Handle
)
{
PRTL_HANDLE_TABLE_ENTRY p;

p = (PRTL_HANDLE_TABLE_ENTRY)
((PCHAR)HandleTable->CommittedHandles + (HandleIndex * HandleTable->SizeOfHandleTableEntry));

if (RtlIsValidHandle( HandleTable, p )) {
*Handle = p;
return TRUE;
}
else {
return FALSE;
}
}
mLee79 2006-11-15
  • 打赏
  • 举报
回复
bs 0分贴.
dragonzxh 2006-11-15
  • 打赏
  • 举报
回复
bs 0分贴.
cpponduty 2006-11-15
  • 打赏
  • 举报
回复
1
laomai 2006-11-15
  • 打赏
  • 举报
回复
1
kuhx 2006-11-15
  • 打赏
  • 举报
回复
1
lbing7 2006-11-15
  • 打赏
  • 举报
回复
1

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧