聊聊游戏辅助那些事上部第一篇——过掉那些讨厌的游戏保护。
这个系列计划分为上下两部,上部是内置型辅助,下部是按键型辅助。我不保证会写完。
聊聊游戏辅助那些事上部第一篇——过掉那些讨厌的游戏保护。
相对以前那些裸奔游戏,现在的新游戏多少都会有些保护,这是绕不过去的坎。
下面针对我发现的几个保护方法,逐个的聊一聊。
1、R3应用层下,DebugActiveProcess 加载调试器时,会设置一个远程断点,而这个远程断点其实多此一举,反而有时会触发反调试检测。唯一要做的就是绕过它。
这是NtDebugActiveProcess的上层函数,DbgUiDebugActiveProcess的反汇编代码:
_DbgUiDebugActiveProcess@4:
00: mov edi,edi
7760FC4C push ebp
7760FC4D mov ebp,esp
7760FC4F mov eax,dword ptr fs:[00000018h]
7760FC55 push esi
7760FC56 push dword ptr [eax+0F24h]
7760FC5C push dword ptr [ebp+8]
7760FC5F call _NtDebugActiveProcess@8 (775909A4h)
7760FC64 mov esi,eax // 原始返回地址
7760FC66 test esi,esi
7760FC68 jl
_DbgUiDebugActiveProcess@4+36h (7760FC80h)
7760FC6A push dword ptr [ebp+8]
7760FC6D call
_DbgUiIssueRemoteBreakin@4 (7760FC03h)
7760FC72 mov esi,eax
7760FC74 test esi,esi
7760FC76 jge
_DbgUiDebugActiveProcess@4+36h (7760FC80h)
7760FC78 push dword ptr [ebp+8]
7760FC7B call _DbgUiStopDebugging@4 (7760FB88h)
7760FC80 mov eax,esi
7760FC82 pop esi // +0x1E后的返回地址
7760FC83 pop ebp
7760FC84 ret 4
下面是64位 WINDOW7 下面的 NtDebugActiveProcess 的钩子函数的具体代码,绕过远程断点的方法是在返回地址上加偏移0x1E
//
// NtDebugActiveProcess
//
NTSTATUS WINAPI DbgNtDebugActiveProcess64(
__in HANDLE ProcessHandle,
__in HANDLE DebugObjectHandle )
{
NTSTATUS Status = TrueNtDebugActiveProcess(ProcessHandle, DebugObjectHandle);
KdPrint((_T("NtDebugActiveProcess 返回值: 0x%08x!\r\n"), Status));
//
// 绕过应用层的远程断点,完全多此一举啊。
//
if (NT_SUCCESS(Status))
{
LPVOID ReturnAddress = (LPSTR)&ProcessHandle - sizeof(DWORD);
*(LPDWORD)ReturnAddress += 0x1E;
}
return Status;
}
2、如果保护程序有驱动,那么在R0核心层下调试端口清零会是绝大多数游戏保护的选择。进程的调试端口保存了一个调试器对像,当有异常发生时,操作系统的异常处理程序会查询这个端口,如果存在调试器,就会将异常发送给调试器,调试器会优先获得异常处理的权利。
网上有不少方法,这儿采用自建调试端口管理的方法绕过它,呵呵,你想清零就清零,反正我又不用它。直接上获取设置调试端口的相关代码。
typedef struct _DEBUGED_PROCESS_ENTRY
{
LIST_ENTRY EventList;
PEPROCESS Process;
PDEBUG_OBJECT DebugPort;
ULONG KeExceptionDispatchCount;
}DEBUGED_PROCESS_ENTRY, *PDEBUGED_PROCESS_ENTRY;
LIST_ENTRY DebugedProcessList;
PDEBUG_OBJECT GetDebugPort(PEPROCESS Process)
{
PDEBUG_OBJECT DebugObject = NULL;
PLIST_ENTRY Entry;
PDEBUGED_PROCESS_ENTRY DebugedProcess;
ExAcquireFastMutex(&DebugedProcessListMutex);
for (Entry = DebugedProcessList.Flink; Entry != &DebugedProcessList; Entry = Entry->Flink)
{
DebugedProcess = CONTAINING_RECORD(Entry, DEBUGED_PROCESS_ENTRY, EventList);
if (DebugedProcess->Process == Process)
{
DebugedProcess->KeExceptionDispatchCount++;
DebugObject = DebugedProcess->DebugPort;
}
}
ExReleaseFastMutex(&DebugedProcessListMutex);
return DebugObject;
}
NTSTATUS SetDebugPort(PEPROCESS Process, PDEBUG_OBJECT DebugProt)
{
PDEBUGED_PROCESS_ENTRY DebugedProcess;
DebugedProcess = (PDEBUGED_PROCESS_ENTRY)ExAllocatePoolWithTag(NonPagedPool,
sizeof(DEBUGED_PROCESS_ENTRY),
'DotP');
if (DebugedProcess)
{
ExAcquireFastMutex(&DebugedProcessListMutex);
DebugedProcess->Process = Process;
DebugedProcess->DebugPort = DebugProt;
DebugedProcess->KeExceptionDispatchCount = 0;
InsertTailList(&DebugedProcessList, &DebugedProcess->EventList);
ExReleaseFastMutex(&DebugedProcessListMutex);
return STATUS_SUCCESS;
}
else
{
return STATUS_INSUFFICIENT_RESOURCES;
}
}
这是真正的核心代码,注意看注释。后面的 DeviceIoControlDispatch 会调用这个函数。
NTSTATUS
OnNtDebugActiveProcess(
IN HANDLE ProcessHandle,
IN HANDLE DebugObjectHandle
)
{
_KdPrint(("NtDebugActiveProcess %x, %x\r\n", ProcessHandle, DebugObjectHandle));
NTSTATUS Status;
KPROCESSOR_MODE PreviousMode;
PEPROCESS Process;
PDEBUG_OBJECT DebugObject;
LIST_ENTRY TempList;
PAGED_CODE();
PreviousMode = KeGetPreviousMode();
Status = ObReferenceObjectByHandle(ProcessHandle,
PROCESS_SET_PORT,
*PsProcessType,
PreviousMode,
(PVOID*)&Process,
NULL);
if (!NT_SUCCESS(Status))
{
return Status;
}
DebugObject = GetDebugPort(Process);
if (DebugObject)
{
Status = STATUS_PORT_ALREADY_SET;
}
if (NT_SUCCESS(Status))
{
//
// 调用系统的调试进程符加函数
//
_KdPrint(("TrueNtDebugActiveProcess Enter\r\n"));
Status = NtDebugActiveProcess(ProcessHandle, DebugObjectHandle);
_KdPrint(("TrueNtDebugActiveProcess Leave\r\n"));
if (NT_SUCCESS(Status))
{
Status = ObReferenceObjectByHandle(DebugObjectHandle,
DEBUG_PROCESS_ASSIGN,
*DbgkDebugObjectType,
PreviousMode,
(PVOID*)&DebugObject,
NULL);
if (NT_SUCCESS(Status))
{
//
// 无痕调试,需要清理调试标志,保存事件列表
//
TempList = DebugObject->EventList;
//
// 从调试对像中移除事件列表
//
InitializeListHead(&DebugObject->EventList);
//
// 清理进程的调试端口及调试标志,不用你清零调试端口了,我自己就直接清零了。
//
DbgkClearProcessDebugObject(Process, DebugObject);
//
// 恢复调试对像的事件列表
//
DebugObject->EventList = TempList;
SetDebugPort(Process, DebugObject);
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(DebugObject);
}
}
}
}
if (!NT_SUCCESS(Status))
{
ObDereferenceObject(Process);
}
return Status;
}
但是用 OnNtDebugActiveProcess 加载那是完全不调试,因为这个函数不用你清零调试端口了,我自己就直接清零了。然后就要对DbgkForwardException下钩子,让我们自己保存的调试端口发挥作用。具体代码。
BOOLEAN
OnDbgkForwardException(
IN PEXCEPTION_RECORD ExceptionRecord,
IN BOOLEAN DebugException,
IN BOOLEAN SecondChance
)
{
DBGKM_APIMSG m;
PDBGKM_EXCEPTION args;
NTSTATUS st;
PAGED_CODE();
if (!DebugException)
{
return FALSE;
}
//
// 进程设置了调试端口,或者没有影射当前进程的调试端口
//
if (GetDebugPort(PsGetCurrentProcess()) == NULL)
{
return FALSE;
}
//
// 调试端口被置零。
//
_KdPrint(("DbgkForwardException ExceptionAddress = %08x, ExceptionCode = %08x \r\n", ExceptionRecord->ExceptionAddress, ExceptionRecord->ExceptionCode));
args = &m.u.Exception;
//
// Initialize the debug LPC message with default information.
//
_KdPrint(("DBGKM_FORMAT_API_MSG\r\n"));
DBGKM_FORMAT_API_MSG(m,DbgKmExceptionApi,sizeof(*args));
//
// Fill in the remainder of the debug LPC message.
//
_KdPrint(("args->ExceptionRecord = *ExceptionRecord\r\n"));
args->ExceptionRecord = *ExceptionRecord;
args->FirstChance = !SecondChance;
//
// Send the debug message to the destination LPC port.
//
_KdPrint(("DbgkpSendApiMessage\r\n"));
st = DbgkpSendApiMessage(&m,DebugException);
//
// If the send was not successful, then return a FALSE indicating that
// the port did not handle the exception. Otherwise, if the debug port
// is specified, then look at the return status in the message.
//
if (!NT_SUCCESS(st) ||
((DebugException) &&
(m.ReturnedStatus == DBG_EXCEPTION_NOT_HANDLED || !NT_SUCCESS(m.ReturnedStatus))))
{
_KdPrint(("DbgkForwardException FAILED, STATUS = %08x, DebugException = %d, ReturnedStatus = %08x!\r\n", st, DebugException, m.ReturnedStatus));
return FALSE;
}
else
{
_KdPrint(("DbgkForwardException SUCCESSED!\r\n"));
return TRUE;
}
}
上面的两个函数用到了几个没有导出的核心函数,这就需要自己定位相关的函数了,这里就不再展开定位的方法了。
调试器在应用层需要添加钩子函数:DbgNtDebugActiveProcess64,与前面的 DbgNtDebugActiveProcess64 的差别在不再调用 TrueNtDebugActiveProcess,而是通过 DeviceIoControl 调用我们自己的NtDebugActiveProcess
//
// NtDebugActiveProcess
//
NTSTATUS WINAPI DbgNtDebugActiveProcess64(
__in HANDLE ProcessHandle,
__in HANDLE DebugObjectHandle )
{
NTSTATUS Status;
DWORD lResultLength;
PARAM_NtDebugActiveProcess64 param;
param.ProcessHandle = ProcessHandle;
param.DebugObjectHandle = DebugObjectHandle;
DeviceIoControl(
g_hModuleDbgHelper,
IOCTL_NtDebugActiveProcess,
¶m,
sizeof(param),
&Status,
sizeof(Status),
&lResultLength,
0);
KdPrint((_T("NtDebugActiveProcess 返回值: 0x%08x!\r\n"), Status));
if (NT_SUCCESS(Status))
{
LPVOID ReturnAddress = (LPSTR)&ProcessHandle - sizeof(DWORD);
*(LPDWORD)ReturnAddress += 0x1E;
}
return Status;
}
3、调试器对像降权。当系统的调试器对像的访问权限被设置为零时,表现为附加不上所有程序,游戏保护让我们创建的调试对像成为没有调试权限的调试对像。处理方法:重建一个调试对像类型,然后替换掉系统的调试对像类型。
NTSTATUS
DbgkCreateDebugObjectType(
POBJECT_TYPE* DebugObjectType
)
{
NTSTATUS Status;
UNICODE_STRING Name;
POBJECT_TYPE SysDebugObjectType;
POBJECT_TYPE ObpTypeObjectType;
PAGED_CODE();
//
// 先打开系统本身的调试对像
//
RtlInitUnicodeString(&Name, L"\\ObjectTypes\\DebugObject");
ObpTypeObjectType = ObGetObjectType(*PsProcessType);
Status = ObReferenceObjectByName(&Name, OBJ_CASE_INSENSITIVE, NULL, 0, ObpTypeObjectType, KernelMode, NULL, (PVOID*)&SysDebugObjectType);
if (NT_SUCCESS(Status))
{
//
// 系统调试器的对像关闭函数
//
(OB_CLOSE_METHOD&)SysDbgkpCloseObject = SysDebugObjectType->TypeInfo.CloseProcedure;
//
// 先试着打开我们的调试对像类型,如果打开成功,直接使用即可
//
RtlInitUnicodeString(&Name, L"\\ObjectTypes\\NewDebugObject");
Status = ObReferenceObjectByName(&Name, OBJ_CASE_INSENSITIVE, NULL, 0, ObpTypeObjectType, KernelMode, NULL, (PVOID*)DebugObjectType);
if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
{
RtlInitUnicodeString(&Name, L"NewDebugObject");
GENERIC_MAPPING GenericMapping = { STANDARD_RIGHTS_READ | DEBUG_READ_EVENT,
STANDARD_RIGHTS_WRITE | DEBUG_PROCESS_ASSIGN,
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
DEBUG_ALL_ACCESS };
OBJECT_TYPE_INITIALIZER oti = { 0 };
oti.Length = sizeof(oti);
oti.SecurityRequired = TRUE;
oti.InvalidAttributes = 0;
oti.PoolType = NonPagedPool;
oti.DeleteProcedure = SysDebugObjectType->TypeInfo.DeleteProcedure;
oti.CloseProcedure = (OB_CLOSE_METHOD)DbgkpCloseObject;
oti.ValidAccessMask = DEBUG_ALL_ACCESS;
oti.GenericMapping = GenericMapping;
oti.DefaultPagedPoolCharge = 0;
oti.DefaultNonPagedPoolCharge = 0;
Status = ObCreateObjectType(&Name, &oti, NULL, DebugObjectType);
}
else if (NT_SUCCESS(Status))
{
(*DebugObjectType)->TypeInfo.CloseProcedure = (OB_CLOSE_METHOD)DbgkpCloseObject;
}
ObDereferenceObject(SysDebugObjectType);
}
return Status;
}
NTSTATUS DbgkInitialize()
{
POBJECT_TYPE NewDebugObjectType;
Status = DbgkCreateDebugObjectType(&NewDebugObjectType);
if (NT_SUCCESS(Status))
{
*DbgkDebugObjectType = NewDebugObjectType;
}
}
DbgkDebugObjectType 为系统内核调试器对像地址,可以通过符号搜索获取地址。TP在启动后会让所用的附加或启动调试失败,然后我们来这么一下,整个世界就安静了。
4、这里感谢一下微软,64位的PG帮了我们不少忙,干掉了很多的游戏保护。在64位的系统下,游戏保护基本上过掉这三个就可以了,当然最后还要加上一个过PG的布丁。32位下则一般还还需要过掉 NtOpenProcess,NtReadVirtualMemory,NtWriteVirtualMemory,NtQuerySystemInformation等几个函数,如果采用主动式难度不算很大。所谓主动式就是你走你的阳关道,我走我的独木桥,我另外开辟一条路走,把钩子下在应用层,让所有调用这些函数都转到我的函数上来。而且这些钩子不是加在游戏程序上,而是加在调试器上。
贴一个32下的应用层 NtOpenProcess 钩子函数:利用 DeviceIoControl 跳到核心层,调用我们自己的核心层的 NtOpenProcess,其它的就不一一贴了。
//
// NtOpenProcess
//
NTSTATUS WINAPI DbgNtOpenProcess32
(
__out PHANDLE ProcessHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__in_opt PCLIENT_ID ClientId)
{
DWORD lResultLength;
NTSTATUS Status;
DeviceIoControl(
g_hModuleDbgHelper,
IOCTL_NtOpenProcess,
&ProcessHandle,
DWORD((&ClientId) + 1) - DWORD(&ProcessHandle),
&Status,
sizeof(Status),
&lResultLength,
0);
KdPrint((_T("NtOpenProcess 返回值: 0x%08x!\r\n"), Status));
return Status;
}
5、前面几个应用层的钩子都用到了 DeviceIoControl,所以贴一下驱动中的 DeviceIoControlDispatch 函数。
NTSTATUS DbgHelperDeviceIoControlDispatch
(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp )
{
PIO_STACK_LOCATION irpStack;
NTSTATUS status;
PDBGHELPER_DEVICE_EXTENSION deviceExtension;
ULONG inputLength;
ULONG outputLength;
_KdPrint( (__FUNCTION__"++. IRP %p", Irp) );
deviceExtension = (PDBGHELPER_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
// Get our IRP stack location
irpStack = IoGetCurrentIrpStackLocation(Irp);
// Get the buffer lengths
inputLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_NtOpenProcess:
{
_KdPrint(("IOCTL_NtOpenProcess"));
PARAM_NtOpenProcess* ioBuffer = (PARAM_NtOpenProcess*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtOpenProcess)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用真正的函数 NtOpenProcess
//
status = DbgHelperNtOpenProcess(ioBuffer->ProcessHandle, ioBuffer->DesiredAccess, ioBuffer->ObjectAttributes, ioBuffer->ClientId);
_KdPrint(("STATUS = 0x%08x, ProcessHandle = 0x%08x, ProcessId = 0x%08x, ThreadId = 0x%08x", status, ioBuffer->ProcessHandle ? *ioBuffer->ProcessHandle : (PHANDLE)-1, ioBuffer->ClientId->UniqueProcess, ioBuffer->ClientId->UniqueThread));
*(NTSTATUS *)ioBuffer = status;
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtCreateDebugObject:
{
_KdPrint(("IOCTL_NtCreateDebugObject Enter\n"));
PARAM_NtCreateDebugObject* ioBuffer = (PARAM_NtCreateDebugObject*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtCreateDebugObject)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的函数 NtCreateDebugObject,返回的 DebugObjectHandle 兼容系统的调试对像
//
status = OnNtCreateDebugObject(ioBuffer->DebugObjectHandle, ioBuffer->DesiredAccess, ioBuffer->ObjectAttributes, ioBuffer->Flags);
_KdPrint(("STATUS = 0x%08x, DebugObjectHandle = 0x%08x, DesiredAccess = 0x%08x, Flags = 0x%08x", status, ioBuffer->DebugObjectHandle ? *ioBuffer->DebugObjectHandle : (HANDLE)-1, ioBuffer->DesiredAccess, ioBuffer->Flags));
*(NTSTATUS *)ioBuffer = status;
_KdPrint(("IOCTL_NtCreateDebugObject Leave\n"));
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtDebugActiveProcess:
{
_KdPrint(("IOCTL_NtDebugActiveProcess Enter\n"));
PARAM_NtDebugActiveProcess* ioBuffer = (PARAM_NtDebugActiveProcess*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtDebugActiveProcess)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的函数 NtDebugActiveProcess
//
status = OnNtDebugActiveProcess(ioBuffer->ProcessHandle, ioBuffer->DebugObjectHandle);
_KdPrint(("STATUS = 0x%08x, ProcessHandle = 0x%08x, DebugObjectHandle = 0x%08x", status, ioBuffer->ProcessHandle, ioBuffer->DebugObjectHandle));
*(NTSTATUS *)ioBuffer = status;
_KdPrint(("IOCTL_NtDebugActiveProcess Leave\n"));
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtRemoveProcessDebug:
{
_KdPrint(("IOCTL_NtRemoveProcessDebug Enter\n"));
PARAM_NtRemoveProcessDebug* ioBuffer = (PARAM_NtRemoveProcessDebug*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtRemoveProcessDebug)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的函数 NtRemoveProcessDebug
//
status = OnNtRemoveProcessDebug(ioBuffer->ProcessHandle, ioBuffer->DebugObjectHandle);
_KdPrint(("STATUS = 0x%08x, ProcessHandle = 0x%08x, DebugObjectHandle = 0x%08x", status, ioBuffer->ProcessHandle, ioBuffer->DebugObjectHandle));
*(NTSTATUS *)ioBuffer = status;
_KdPrint(("IOCTL_NtRemoveProcessDebug Leave\n"));
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtReadVirtualMemory:
{
_KdPrint(("IOCTL_NtReadVirtualMemory"));
PARAM_NtReadVirtualMemory* ioBuffer = (PARAM_NtReadVirtualMemory*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtReadVirtualMemory)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的 NtReadVirtualMemory 函数
//
status = DbgHelperNtReadVirtualMemory(ioBuffer->ProcessHandle, ioBuffer->BaseAddress, ioBuffer->Buffer, ioBuffer->BufferSize, ioBuffer->NumberOfBytesWritten);
_KdPrint(("STATUS = 0x%08x, ProcessHandle = 0x%08x, BaseAddress = 0x%08x, BufferSize = 0x%08x", status, ioBuffer->ProcessHandle, ioBuffer->BaseAddress, ioBuffer->BufferSize));
*(NTSTATUS *)ioBuffer = status;
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtWriteVirtualMemory:
{
_KdPrint(("IOCTL_NtWriteVirtualMemory"));
PARAM_NtWriteVirtualMemory* ioBuffer = (PARAM_NtWriteVirtualMemory*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtWriteVirtualMemory)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的 NtWriteVirtualMemory 函数
//
status = DbgHelperNtWriteVirtualMemory(ioBuffer->ProcessHandle, ioBuffer->BaseAddress, ioBuffer->Buffer, ioBuffer->BufferSize, ioBuffer->NumberOfBytesWritten);
_KdPrint(("STATUS = 0x%08x, ProcessHandle = 0x%08x, BaseAddress = 0x%08x, BufferSize = 0x%08x", status, ioBuffer->ProcessHandle, ioBuffer->BaseAddress, ioBuffer->BufferSize));
*(NTSTATUS *)ioBuffer = status;
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
case IOCTL_NtQuerySystemInformation:
{
_KdPrint(("IOCTL_NtQuerySystemInformation Enter\n"));
PARAM_NtQuerySystemInformation* ioBuffer = (PARAM_NtQuerySystemInformation*)Irp->AssociatedIrp.SystemBuffer;
if ((ioBuffer == NULL) || (inputLength != sizeof(PARAM_NtQuerySystemInformation)) || (outputLength < sizeof(NTSTATUS)))
{
return CompleteIrp(Irp, STATUS_INVALID_PARAMETER, 0);
}
else
{
//
// 调用我们自己的函数 NtRemoveProcessDebug
//
status = NtQuerySystemInformation(ioBuffer->SystemInformationClass, ioBuffer->SystemInformation, ioBuffer->SystemInformationLength, ioBuffer->ReturnLength);
_KdPrint(("STATUS = 0x%08x, SystemInformationClass = %d, SystemInformation = %d", status, ioBuffer->SystemInformationClass, ioBuffer->SystemInformation));
*(NTSTATUS *)ioBuffer = status;
_KdPrint(("IOCTL_NtQuerySystemInformation Leave\n"));
return CompleteIrp(Irp, STATUS_SUCCESS, sizeof(NTSTATUS));
}
}
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Status = status;
IoCompleteRequest (Irp, IO_NO_INCREMENT);
break;
}
_KdPrint( (__FUNCTION__"--. IRP %p STATUS %x", Irp, status) );
return status;
}
最后预告一下,本系列的第二篇,聊聊游戏辅助那些事上部第二篇——跟踪是个苦力活,调试器有什么好建议?
当然什么时候发我自己也不知道了,因为还没写呢。想看的就自己关注了。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 德育管理系统
本系统可以根据学校德育量化考核规定,自行调整修改考核条目和分值,后台录入考核记录后,前台可以统计班级和学生,每周,每月,每学期的成绩。后台录入具备:多生,多班,多课等多种录入模式,提高录入数据的效率,也具备学生请假功能。在后台添加各项违纪和表彰记录,前台自…...
2024/4/16 23:34:44 - 超级好用 的js控制checkbox个数选择
上次发了一个js控制checkbox个数选择,自己感觉不是那么好用,修改了下,发现这个很好很好用滴,自己再修改下就OK了 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">…...
2024/4/17 4:14:18 - SQL Server 2008还原数据库时出现“备份集中的数据库备份与现有的数据库不同”的解决方法
引言现在在做项目,由于每个人是分模块的,所以大家的测试数据都不同步,导致好多时候会因为别人填的数据不同而调半天的错。所以我还是自己还原一个数据库,自己填自己的数据吧。报错之前还原过很多个数据库都没什么问题,这次也是按照之前的步骤,先建立了一个目标数据库,之…...
2024/4/16 23:35:38 - 可汗学院教学课程总目录
文章目录数学[脑筋急转弯](http://v.163.com/special/Khan/brainteasers.html)[算术与代数预备课程:乘法与除法](http://v.163.com/special/Khan/multiplication.html)[微分方程](http://v.163.com/special/Khan/differential.html)[数学涂鸦](http://open.163.com/special/Kh…...
2024/4/12 7:41:39 - Angular 2 组件的生命周期简要
接口 OnInit OnDestroy DoCheck OnChanges AfterContentInit AfterContentChecked AfterViewInit AfterViewChecked 函数名 ngOnChanges - 当输入/输出绑定的值改变时调用 ngOnInit - 在第一次 ngOnChanges 后调用 ngDoCheck - 自定义的方法,检测和处理值的改变 ngAfterConten…...
2024/5/5 17:02:46 - C++,笔试面试,使用C++编程,实现万年历
要求实现:基本成员函数,日期加减天数,日期与日期相减#include<iostream> using namespace std;class Date { public:Date(int year = 1900, int month = 1, int day = 1):_year(year), _month(month), _day(day){//cout << "Date(int year, int month, int…...
2024/4/16 23:35:38 - android 游戏 实战打飞机游戏 菜单页面(1)
目标 实现 控制 小飞机 左右移动 躲避子弹 打boss.本节 实现 开始菜单界面1 首先 资源文件拷过来2, 划分游戏状态 public static final int GAME_MENU = 0;// 游戏菜单public static final int GAMEING = 1;// 游戏中public static final int GAME_WIN = 2;// 游戏胜利public…...
2024/4/19 14:25:38 - MySQL数据库备份和恢复方案小结
这两天在调研MySQL数据库的备份和恢复方案,备份对象是对大量Innodb表,或者加上少量的MyISAM表。InnoDB备份常见问题:文件一致性:数据文件、缓存、日志文件必须保持严格一致。加锁的方法没法保证一致性,因为InnoDB后台刷新数据是异步进行的。数据一致性:不能一次锁住一张表…...
2024/4/20 13:43:27 - jquery 控制复选框选中个数
效果描述: 页面上有一个文本框,在文本框的值改变时,复选框选中的个数也跟着改变;复选框选中的个数变了,文本框里的值也跟着变! 代码实现:1 <script type="text/javascript" language="javascript"> 2 /*当输入张数时,复选框就选中 */ 3 …...
2024/4/27 14:41:15 - 简陋至极:微信小程序日历组件(思路)
最近在做微信小程序项目,其中涉及到日历。一直以来,遇到日历,就是网上随便找个插件,这次心血来潮,想着自己去实现一下。这次不是封装功能强大,健硕完美的组件,只是记录一下,主体思路。更多功能还得根据项目需要,自己去挖掘、实现。(大佬轻喷)思路分析首先最主要的一…...
2024/4/10 5:07:21 - 银行账户管理系统(一)
一个活期储蓄帐户包括账号(id),余额(balance),年利率(rate)等信息,还包括显示账户信息(show),存款(desposit),取款(withdraw),结算利息(settle)等操作。为此设计一个savingaccount类,将id,balance,rate,作为其成员数据,将show,deposit,withdraw,se…...
2024/4/18 23:15:19 - 复选框数据请求到后台
html 基本 <form action="test.php" method="post" id="form1"> <label><input id="all" type="checkbox" value="" οnclick="DoCheck()" />全选</label>您喜欢的水果?<b…...
2024/4/20 10:28:35 - Sql数据库备份还原(解决因为数据库正在使用,所以无法获得对数据库的独占访问权问题)
sql备份语句BACKUP DATABASE [databaseName] TO DISK =D:\mydb.BAK 使用者注意,备份后BAK文件是放在了数据库所在机器的路径下,如果用虚拟主机的话,你的项目是访问不到这个bak文件的。。注意[databaseName]为你要备份的数据库。mydb.BAK为你备份数据库生成的Bak文件sql还原还…...
2024/5/5 6:02:15 - 2005 年下半年程序员上 下午试卷
2005 年下半年程序员上 下午试卷 欢迎访问软件考试网(www.hbsoft.net)●在 Word 文字处理软件的界面上,单击工具栏上的“”按钮,其作用是__(1)__。 欢迎访问软件考试网(www.hbsoft.net)(1) A. 打印当前页B. 打印文档全文C. 打印预览D. 弹出打印对话框进行设…...
2024/4/20 17:21:58 - 简单突破数据库备份路径拿shell
当后台可以数据库备份的时候,你是否顿时笑了?可当备份路径不能修改,而且后缀是mdb不变,你情何以堪? 这里就说个很简单的办法,进行一次数据库备份,并抓包下来。 POST /manage/DataManage.asp?From=Confirm&Action=DataBackup&Result=Site HTTP/1.1 Accept: image/g…...
2024/4/17 2:09:21 - Spring实战教程 | 第十一篇:SrpringAOP之Spring中的自动代理
自动代理的好处:自动检查IoC容器的目标对象,并对这些目标对象产生代理对象,也就是我们不用为每个Action建立相应的代理bean 下面的例子是所有类都以do开头的方法,在被调用时,都要进行日志的输出 实现思路: ① 在接口TimeBookInterface中添加方法doAuditing()和doCh…...
2024/4/28 16:19:40 - 基于百度万年历定制化 1
项目需求: 某门户项目需要在右上角添置一个日期(yyyy-MM-dd)的显示,同时点击此时间可以弹出一个窗体,窗体内容为万年历。 万年历需求: 1、日志显示24节气,且24节气内容可配置 2、对法定节假日可进行配置管理 项目开发周期: 一周 项目技术选择: 1、基于网上现存的万年历…...
2024/4/21 5:33:33 - 图书管理系统之项目提出与需求分析
1 项目提出: 随着计算机的普及和信息技术的发展,人们的生活发生了日新月异的变化,各类计算机软件逐渐渗透到了社会的每个角落,大大地改善了人们的生活质量,提高了人们的工作效率。在高校中,图书借阅是学生获取知识的一个很重要的途径,如何既能方便学生借书,又能减轻图书…...
2024/4/16 23:36:20 - .nb3数据库备份
数据库备还原 今天公司给了一一压缩包,说是数据库,第一次见这种格式文件很是奇怪, 于是去百度 .nb3 发现是数据库备份文件,后来问同事才知道是数据库备份文件, 他使用 navicat 打开,于是下载了navicat,打开过程中出现乱码,完成未见数据库表格 于是百度数据库恢复乱码,发现要用…...
2024/4/16 23:34:38 - 源辰项目-1
接口:==================package com.huaiwei.ben; public interface Filter { public boolean doCheck( Object obj );}====================package com.huaiwei.ben; public interface Measure { public double measure( Object obj);}========================package co…...
2024/4/24 15:59:40
最新文章
- MySQL索引及优化
MySQL索引及优化 一、MySQL索引1、什么是索引?2、了解过索引的数据结构吗?B树和B树的区别?(底层原理)3、什么是聚簇索引(聚集索引)?什么是非聚簇索引(二级索引࿰…...
2024/5/5 20:53:08 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)
OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理,该处理过程会对图像做高斯模糊化以保证图像在进行放大(/缩小)后尽可能保留源图像所展现的具体内容(消除固定频率插值/采样带来的香农采样信息损失)&#x…...
2024/5/5 8:49:58 - 使用 Kafka 保证消息不丢失的策略及原理解析
✨✨祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天开心!✨✨ 🎈🎈作者主页: 喔的嘛呀🎈🎈 目录 一、引言 二. 持久化存储 2.1持久化存储原理: 2.2使用示例: …...
2024/5/5 8:26:54 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/4 23:55:17 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/4 18:20:48 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57