驱动开发笔记3—SSDT表详解
SSDT表
SSDT的全称是"System Services Descriptor Table",即系统服务描述表,在内核中的实际名称是KeServiceDescriptorTable,这个表由ntoskrnl.exe导出(在x64里不导出)。
SSDT用于处理应用层通过Kernel32.dll下发的各个API操作请求。ntdll.dll中的API是一个简单的包装函数,当Kernel32.dll中的API通过Ntdll.dll时,会先完成对参数的检查,再调用一个中断(int 2Eh 或者 SysEnter指令),从而实现从Ring3层进入Ring0层,并将要调用的服务号(也就是SSDT数组中的索引号index值)存放到寄存器EAX中,最后根据存放在EAX中的索引值在SSDT数组中调用指定的服务(Nt系列函数)。
KeServiceDescriptorTable变量是在NTOS模块中导出的一个全局变量,声明一下就可以用
3: kd> dd KeServiceDescriptorTable
849acb00 848c143c 00000000 00000191 848c1a84
(其中,848c143c就是SSDT表的基地址,00000191是SSDT表中服务函数的个数)
extern PSYSTEM_SERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;typedef struct _SYSTEM_SERVICE_DESCRIPTOR_TABLE
{PVOID ServiceTableBase; //SSDT表的基地址PVOID ServiceCounterTableBase;ULONG_PTR NumberOfServices; //SSDT表中服务函数的个数PVOID ParameterTableBase;
}SYSTEM_SERVICE_DESCRIPTOR_TABLE, *PSYSTEM_SERVICE_DESCRIPTOR_TABLE;
知道了SSDT表的基地址(数组的首地址)和SSDT函数的索引号(Index),就可以求出对应的服务函数的地址。
在x86平台上: FuncAddress = KeServiceDescriptorTable + 4 * Index
在x64平台上:FuncAddress = [KeServiceDescriptorTable+4*Index]>>4 + KeServiceDescriptorTable
获得SSDT表中Nt函数索引的方法:
先获得Zw函数的地址,然后加一个字节得到Nt函数的索引
注意:
ntkrnlpa.exe的物理内存是映射到Ring0层内存空间的,和我们的进程(xxx.sys)是在一片内存空间中,因此可以直接访问。
ntdll.dll的物理内存是映射在Ring3层内存空间的(映射到每一个应用程序的内存中),我们的进程(xxx.sys)若想要访问ntdll.dll的数据,需要先把它的物理内存映射到自己(xxx.sys)的内存空间,然后才能访问。
1. 直接访问ntkrnlpa.exe中的SSDT表
UNICODE_STRING v1;
RtlInitUnicodeString(&v1, L"ZwOpenProcess");
ZwOpenProcess = MmGetSystemRoutineAddress(&v1);#define SSDT_INDEX(ZwFunctionAddress) *(PULONG)(ZwFunctionAddress + 1)
/*3: kd> u ZwOpenProcessnt!ZwOpenProcess:8487ecd8 b8be000000 mov eax,0BEh3: kd> dd 8487ecd88487ecd8 0000beb8 24548d00 086a9c04 0019d5e83: kd> dd 8487ecd98487ecd9 000000be 0424548d e8086a9c 000019d5*/
//ZwFunctionAddress + 1,加一个字节,越过那个b8,就能得到索引
2. 通过访问Ntdll.dll模块的导出表
首先通过Ntdll.dll的路径获得文件句柄,然后通过文件句柄获得映射句柄,然后映射Ntdll.dll物理内存到当前进程的内存空间,得到映射内存的首地址和映射内存大小。
通过模块基地址,访问ntdll.dll模块的导出表,利用那三个数组,来获得Zw函数地址,最后加一个字节得到Nt函数索引。
NTSTATUS MyGetSSDTFunctionIndex(char* ZwFunctionName, ULONG* NtFunctionIndex)
{NTSTATUS Status = STATUS_UNSUCCESSFUL;WCHAR FileFullPath[] = L"\\SystemRoot\\System32\\ntdll.dll";PVOID MappedFileVA = NULL;ULONG MappedFileSize = 0;PIMAGE_NT_HEADERS ImageNtHeaders = NULL;PIMAGE_EXPORT_DIRECTORY ImageExportDirectory = NULL;ULONG* AddressOfFunctions = NULL;ULONG* AddressOfNames = NULL;USHORT* AddressOfNameOrdinals = NULL;ULONG i = 0;char* FunctionName = NULL;PUCHAR FunctionAddress = NULL;ULONG Offset = 1;if (!ZwFunctionName){return Status;}//将Ntdll.dll文件映射到系统空间中if (!NT_SUCCESS(MyMappingPEFileInRing0Space(FileFullPath, &MappedFileVA, &MappedFileSize))){return Status;}__try{//通过Dos头获得Nt头ImageNtHeaders = RtlImageNtHeader(MappedFileVA);if (ImageNtHeaders && ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress){ImageExportDirectory = (IMAGE_EXPORT_DIRECTORY*)((ULONG_PTR)MappedFileVA + ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);AddressOfFunctions = (ULONG*)((ULONG_PTR)MappedFileVA + ImageExportDirectory->AddressOfFunctions);AddressOfNames = (ULONG*)((ULONG_PTR)MappedFileVA + ImageExportDirectory->AddressOfNames);AddressOfNameOrdinals = (USHORT*)((ULONG_PTR)MappedFileVA + ImageExportDirectory->AddressOfNameOrdinals);for (i = 0; i < ImageExportDirectory->NumberOfNames; i++){FunctionName = (char*)((ULONG_PTR)MappedFileVA + AddressOfNames[i]);if (!_stricmp(FunctionName, ZwFunctionName)){FunctionAddress = (PUCHAR)((ULONG_PTR)MappedFileVA + AddressOfFunctions[AddressOfNameOrdinals[i]]);*NtFunctionIndex = *(ULONG*)(FunctionAddress + 1); //加1个字节,即越过b8,得到索引be000000Status = STATUS_SUCCESS;break;} }}}__except (EXCEPTION_EXECUTE_HANDLER){}//回收内存ZwUnmapViewOfSection(NtCurrentProcess(), MappedFileVA);if (*NtFunctionIndex == -1){return STATUS_UNSUCCESSFUL;}return Status;
}
NTSTATUS MyMappingPEFileInRing0Space(WCHAR* FileFullPath, PVOID* MappedFileVA, ULONG* MappedFileSize)
{NTSTATUS Status = STATUS_UNSUCCESSFUL;UNICODE_STRING v1;OBJECT_ATTRIBUTES ObjectAttributes;IO_STATUS_BLOCK IoStatusBlock;HANDLE FileHandle = NULL;HANDLE SectionHandle = NULL;if (!FileFullPath || !MappedFileVA){return Status;}RtlInitUnicodeString(&v1, FileFullPath);InitializeObjectAttributes(&ObjectAttributes, &v1, OBJ_CASE_INSENSITIVE, NULL, NULL); //OBJ_CASE_INSENSITIVE表示忽略大小写//获得文件句柄Status = ZwCreateFile(&FileHandle,SYNCHRONIZE,&ObjectAttributes,&IoStatusBlock,NULL,FILE_ATTRIBUTE_NORMAL,FILE_SHARE_READ,FILE_OPEN,FILE_SYNCHRONOUS_IO_NONALERT,NULL,0);if (!NT_SUCCESS(Status)){return Status;}//通过文件句柄创建一个映射对象ObjectAttributes.ObjectName = NULL;Status = ZwCreateSection(&SectionHandle,SECTION_QUERY | SECTION_MAP_READ,&ObjectAttributes,NULL,PAGE_WRITECOPY, //写拷贝SEC_IMAGE, //内存对齐FileHandle);ZwClose(FileHandle);if (!NT_SUCCESS(Status)){return Status;}//通过映射句柄获得虚拟地址空间Status = ZwMapViewOfSection(SectionHandle,NtCurrentProcess(), //映射到当前进程的内存空间中MappedFileVA,0, 0, 0,MappedFileSize,ViewUnmap, 0, PAGE_WRITECOPY);ZwClose(SectionHandle);if (!NT_SUCCESS(Status)){return Status;}return Status;
}
SSDT表中的函数列表
SSDT表中共有0x191个函数,分别是:
0x0 NtAcceptConnectPort
0x1 NtAccessCheck
0x2 NtAccessCheckAndAuditAlarm
0x3 NtAccessCheckByType
0x4 NtAccessCheckByTypeAndAuditAlarm
0x5 NtAccessCheckByTypeResultList
0x6 NtAccessCheckByTypeResultListAndAuditAlarm
0x7 NtAccessCheckByTypeResultListAndAuditAlarmByHandle
0x8 NtAddAtom
0x9 NtAddBootEntry
0xA NtAddDriverEntry
0xB NtAdjustGroupsToken
0xC NtAdjustPrivilegesToken
0xD NtAlertResumeThread
0xE NtAlertThread
0xF NtAllocateLocallyUniqueId
0x10 NtAllocateReserveObject
0x11 NtAllocateUserPhysicalPages
0x12 NtAllocateUuids
0x13 NtAllocateVirtualMemory
0x14 NtAlpcAcceptConnectPort
0x15 NtAlpcCancelMessage
0x16 NtAlpcConnectPort
0x17 NtAlpcCreatePort
0x18 NtAlpcCreatePortSection
0x19 NtAlpcCreateResourceReserve
0x1A NtAlpcCreateSectionView
0x1B NtAlpcCreateSecurityContext
0x1C NtAlpcDeletePortSection
0x1D NtAlpcDeleteResourceReserve
0x1E NtAlpcDeleteSectionView
0x1F NtAlpcDeleteSecurityContext
0x20 NtAlpcDisconnectPort
0x21 NtAlpcImpersonateClientOfPort
0x22 NtAlpcOpenSenderProcess
0x23 NtAlpcOpenSenderThread
0x24 NtAlpcQueryInformation
0x25 NtAlpcQueryInformationMessage
0x26 NtAlpcRevokeSecurityContext
0x27 NtAlpcSendWaitReceivePort
0x28 NtAlpcSetInformation
0x29 NtApphelpCacheControl
0x2A NtAreMappedFilesTheSame
0x2B NtAssignProcessToJobObject
0x2C NtCallbackReturn
0x2D NtCancelIoFile
0x2E NtCancelIoFileEx
0x2F NtCancelSynchronousIoFile
0x30 NtCancelTimer
0x31 NtClearEvent
0x32 NtClose
0x33 NtCloseObjectAuditAlarm
0x34 NtCommitComplete
0x35 NtCommitEnlistment
0x36 NtCommitTransaction
0x37 NtCompactKeys
0x38 NtCompareTokens
0x39 NtCompleteConnectPort
0x3A NtCompressKey
0x3B NtConnectPort
0x3C NtContinue
0x3D NtCreateDebugObject
0x3E NtCreateDirectoryObject
0x3F NtCreateEnlistment
0x40 NtCreateEvent
0x41 NtCreateEventPair
0x42 NtCreateFile
0x43 NtCreateIoCompletion
0x44 NtCreateJobObject
0x45 NtCreateJobSet
0x46 NtCreateKey
0x47 NtCreateKeyedEvent
0x48 NtCreateKeyTransacted
0x49 NtCreateMailslotFile
0x4A NtCreateMutant
0x4B NtCreateNamedPipeFile
0x4C NtCreatePagingFile
0x4D NtCreatePort
0x4E NtCreatePrivateNamespace
0x4F NtCreateProcess
0x50 NtCreateProcessEx
0x51 NtCreateProfile
0x52 NtCreateProfileEx
0x53 NtCreateResourceManager
0x54 NtCreateSection
0x55 NtCreateSemaphore
0x56 NtCreateSymbolicLinkObject
0x57 NtCreateThread
0x58 NtCreateThreadEx
0x59 NtCreateTimer
0x5A NtCreateToken
0x5B NtCreateTransaction
0x5C NtCreateTransactionManager
0x5D NtCreateUserProcess
0x5E NtCreateWaitablePort
0x5F NtCreateWorkerFactory
0x60 NtDebugActiveProcess
0x61 NtDebugContinue
0x62 NtDelayExecution
0x63 NtDeleteAtom
0x64 NtDeleteBootEntry
0x65 NtDeleteDriverEntry
0x66 NtDeleteFile
0x67 NtDeleteKey
0x68 NtDeleteObjectAuditAlarm
0x69 NtDeletePrivateNamespace
0x6A NtDeleteValueKey
0x6B NtDeviceIoControlFile
0x6C NtDisableLastKnownGood
0x6D NtDisplayString
0x6E NtDrawText
0x6F NtDuplicateObject
0x70 NtDuplicateToken
0x71 NtEnableLastKnownGood
0x72 NtEnumerateBootEntries
0x73 NtEnumerateDriverEntries
0x74 NtEnumerateKey
0x75 NtEnumerateSystemEnvironmentValuesEx
0x76 NtEnumerateTransactionObject
0x77 NtEnumerateValueKey
0x78 NtExtendSection
0x79 NtFilterToken
0x7A NtFindAtom
0x7B NtFlushBuffersFile
0x7C NtFlushInstallUILanguage
0x7D NtFlushInstructionCache
0x7E NtFlushKey
0x7F NtFlushProcessWriteBuffers
0x80 NtFlushVirtualMemory
0x81 NtFlushWriteBuffer
0x82 NtFreeUserPhysicalPages
0x83 NtFreeVirtualMemory
0x84 NtFreezeRegistry
0x85 NtFreezeTransactions
0x86 NtFsControlFile
0x87 NtGetContextThread
0x88 NtGetCurrentProcessorNumber
0x89 NtGetDevicePowerState
0x8A NtGetMUIRegistryInfo
0x8B NtGetNextProcess
0x8C NtGetNextThread
0x8D NtGetNlsSectionPtr
0x8E NtGetNotificationResourceManager
0x8F NtGetPlugPlayEvent
0x90 NtGetWriteWatch
0x91 NtImpersonateAnonymousToken
0x92 NtImpersonateClientOfPort
0x93 NtImpersonateThread
0x94 NtInitializeNlsFiles
0x95 NtInitializeRegistry
0x96 NtInitiatePowerAction
0x97 NtIsProcessInJob
0x98 NtIsSystemResumeAutomatic
0x99 NtIsUILanguageComitted
0x9A NtListenPort
0x9B NtLoadDriver
0x9C NtLoadKey
0x9D NtLoadKey2
0x9E NtLoadKeyEx
0x9F NtLockFile
0xA0 NtLockProductActivationKeys
0xA1 NtLockRegistryKey
0xA2 NtLockVirtualMemory
0xA3 NtMakePermanentObject
0xA4 NtMakeTemporaryObject
0xA5 NtMapCMFModule
0xA6 NtMapUserPhysicalPages
0xA7 NtMapUserPhysicalPagesScatter
0xA8 NtMapViewOfSection
0xA9 NtModifyBootEntry
0xAA NtModifyDriverEntry
0xAB NtNotifyChangeDirectoryFile
0xAC NtNotifyChangeKey
0xAD NtNotifyChangeMultipleKeys
0xAE NtNotifyChangeSession
0xAF NtOpenDirectoryObject
0xB0 NtOpenEnlistment
0xB1 NtOpenEvent
0xB2 NtOpenEventPair
0xB3 NtOpenFile
0xB4 NtOpenIoCompletion
0xB5 NtOpenJobObject
0xB6 NtOpenKey
0xB7 NtOpenKeyEx
0xB8 NtOpenKeyedEvent
0xB9 NtOpenKeyTransacted
0xBA NtOpenKeyTransactedEx
0xBB NtOpenMutant
0xBC NtOpenObjectAuditAlarm
0xBD NtOpenPrivateNamespace
0xBE NtOpenProcess
0xBF NtOpenProcessToken
0xC0 NtOpenProcessTokenEx
0xC1 NtOpenResourceManager
0xC2 NtOpenSection
0xC3 NtOpenSemaphore
0xC4 NtOpenSession
0xC5 NtOpenSymbolicLinkObject
0xC6 NtOpenThread
0xC7 NtOpenThreadToken
0xC8 NtOpenThreadTokenEx
0xC9 NtOpenTimer
0xCA NtOpenTransaction
0xCB NtOpenTransactionManager
0xCC NtPlugPlayControl
0xCD NtPowerInformation
0xCE NtPrepareComplete
0xCF NtPrepareEnlistment
0xD0 NtPrePrepareComplete
0xD1 NtPrePrepareEnlistment
0xD2 NtPrivilegeCheck
0xD3 NtPrivilegedServiceAuditAlarm
0xD4 NtPrivilegeObjectAuditAlarm
0xD5 NtPropagationComplete
0xD6 NtPropagationFailed
0xD7 NtProtectVirtualMemory
0xD8 NtPulseEvent
0xD9 NtQueryAttributesFile
0xDA NtQueryBootEntryOrder
0xDB NtQueryBootOptions
0xDC NtQueryDebugFilterState
0xDD NtQueryDefaultLocale
0xDE NtQueryDefaultUILanguage
0xDF NtQueryDirectoryFile
0xE0 NtQueryDirectoryObject
0xE1 NtQueryDriverEntryOrder
0xE2 NtQueryEaFile
0xE3 NtQueryEvent
0xE4 NtQueryFullAttributesFile
0xE5 NtQueryInformationAtom
0xE6 NtQueryInformationEnlistment
0xE7 NtQueryInformationFile
0xE8 NtQueryInformationJobObject
0xE9 NtQueryInformationPort
0xEA NtQueryInformationProcess
0xEB NtQueryInformationResourceManager
0xEC NtQueryInformationThread
0xED NtQueryInformationToken
0xEE NtQueryInformationTransaction
0xEF NtQueryInformationTransactionManager
0xF0 NtQueryInformationWorkerFactory
0xF1 NtQueryInstallUILanguage
0xF2 NtQueryIntervalProfile
0xF3 NtQueryIoCompletion
0xF4 NtQueryKey
0xF5 NtQueryLicenseValue
0xF6 NtQueryMultipleValueKey
0xF7 NtQueryMutant
0xF8 NtQueryObject
0xF9 NtQueryOpenSubKeys
0xFA NtQueryOpenSubKeysEx
0xFB NtQueryPerformanceCounter
0xFC NtQueryPortInformationProcess
0xFD NtQueryQuotaInformationFile
0xFE NtQuerySection
0xFF NtQuerySecurityAttributesToken
0x100 NtQuerySecurityObject
0x101 NtQuerySemaphore
0x102 NtQuerySymbolicLinkObject
0x103 NtQuerySystemEnvironmentValue
0x104 NtQuerySystemEnvironmentValueEx
0x105 NtQuerySystemInformation
0x106 NtQuerySystemInformationEx
0x107 NtQuerySystemTime
0x108 NtQueryTimer
0x109 NtQueryTimerResolution
0x10A NtQueryValueKey
0x10B NtQueryVirtualMemory
0x10C NtQueryVolumeInformationFile
0x10D NtQueueApcThread
0x10E NtQueueApcThreadEx
0x10F NtRaiseException
0x110 NtRaiseHardError
0x111 NtReadFile
0x112 NtReadFileScatter
0x113 NtReadOnlyEnlistment
0x114 NtReadRequestData
0x115 NtReadVirtualMemory
0x116 NtRecoverEnlistment
0x117 NtRecoverResourceManager
0x118 NtRecoverTransactionManager
0x119 NtRegisterProtocolAddressInformation
0x11A NtRegisterThreadTerminatePort
0x11B NtReleaseKeyedEvent
0x11C NtReleaseMutant
0x11D NtReleaseSemaphore
0x11E NtReleaseWorkerFactoryWorker
0x11F NtRemoveIoCompletion
0x120 NtRemoveIoCompletionEx
0x121 NtRemoveProcessDebug
0x122 NtRenameKey
0x123 NtRenameTransactionManager
0x124 NtReplaceKey
0x125 NtReplacePartitionUnit
0x126 NtReplyPort
0x127 NtReplyWaitReceivePort
0x128 NtReplyWaitReceivePortEx
0x129 NtReplyWaitReplyPort
0x12A NtRequestPort
0x12B NtRequestWaitReplyPort
0x12C NtResetEvent
0x12D NtResetWriteWatch
0x12E NtRestoreKey
0x12F NtResumeProcess
0x130 NtResumeThread
0x131 NtRollbackComplete
0x132 NtRollbackEnlistment
0x133 NtRollbackTransaction
0x134 NtRollforwardTransactionManager
0x135 NtSaveKey
0x136 NtSaveKeyEx
0x137 NtSaveMergedKeys
0x138 NtSecureConnectPort
0x139 NtSerializeBoot
0x13A NtSetBootEntryOrder
0x13B NtSetBootOptions
0x13C NtSetContextThread
0x13D NtSetDebugFilterState
0x13E NtSetDefaultHardErrorPort
0x13F NtSetDefaultLocale
0x140 NtSetDefaultUILanguage
0x141 NtSetDriverEntryOrder
0x142 NtSetEaFile
0x143 NtSetEvent
0x144 NtSetEventBoostPriority
0x145 NtSetHighEventPair
0x146 NtSetHighWaitLowEventPair
0x147 NtSetInformationDebugObject
0x148 NtSetInformationEnlistment
0x149 NtSetInformationFile
0x14A NtSetInformationJobObject
0x14B NtSetInformationKey
0x14C NtSetInformationObject
0x14D NtSetInformationProcess
0x14E NtSetInformationResourceManager
0x14F NtSetInformationThread
0x150 NtSetInformationToken
0x151 NtSetInformationTransaction
0x152 NtSetInformationTransactionManager
0x153 NtSetInformationWorkerFactory
0x154 NtSetIntervalProfile
0x155 NtSetIoCompletion
0x156 NtSetIoCompletionEx
0x157 NtSetLdtEntries
0x158 NtSetLowEventPair
0x159 NtSetLowWaitHighEventPair
0x15A NtSetQuotaInformationFile
0x15B NtSetSecurityObject
0x15C NtSetSystemEnvironmentValue
0x15D NtSetSystemEnvironmentValueEx
0x15E NtSetSystemInformation
0x15F NtSetSystemPowerState
0x160 NtSetSystemTime
0x161 NtSetThreadExecutionState
0x162 NtSetTimer
0x163 NtSetTimerEx
0x164 NtSetTimerResolution
0x165 NtSetUuidSeed
0x166 NtSetValueKey
0x167 NtSetVolumeInformationFile
0x168 NtShutdownSystem
0x169 NtShutdownWorkerFactory
0x16A NtSignalAndWaitForSingleObject
0x16B NtSinglePhaseReject
0x16C NtStartProfile
0x16D NtStopProfile
0x16E NtSuspendProcess
0x16F NtSuspendThread
0x170 NtSystemDebugControl
0x171 NtTerminateJobObject
0x172 NtTerminateProcess
0x173 NtTerminateThread
0x174 NtTestAlert
0x175 NtThawRegistry
0x176 NtThawTransactions
0x177 NtTraceControl
0x178 NtTraceEvent
0x179 NtTranslateFilePath
0x17A NtUmsThreadYield
0x17B NtUnloadDriver
0x17C NtUnloadKey
0x17D NtUnloadKey2
0x17E NtUnloadKeyEx
0x17F NtUnlockFile
0x180 NtUnlockVirtualMemory
0x181 NtUnmapViewOfSection
0x182 NtVdmControl
0x183 NtWaitForDebugEvent
0x184 NtWaitForKeyedEvent
0x185 NtWaitForMultipleObjects
0x186 NtWaitForMultipleObjects32
0x187 NtWaitForSingleObject
0x188 NtWaitForWorkViaWorkerFactory
0x189 NtWaitHighEventPair
0x18A NtWaitLowEventPair
0x18B NtWorkerFactoryWorkerReady
0x18C NtWriteFile
0x18D NtWriteFileGather
0x18E NtWriteRequestData
0x18F NtWriteVirtualMemory
0x190 NtYieldExecution
驱动开发笔记3—SSDT表详解相关推荐
- 【Linux驱动开发】Linux设备树详解
目录 一.设备树基础 1.概念 2.文件格式 3.编译工具 二.DTS语法 1..dtsi 头文件 2. 设备节点 3.标准属性 4.compatible 属性详解 5.修改设备树文件,增加或修改节点 ...
- RK3399驱动开发 | 08 - RK3399显示系统详解(基于RK SDK Linux 4.4.194内核)
一.RK3399的显示系统 RK3399有两个视频显示控制器(VOP,Video Output Processor),支持不同的分辨率,分别为VOPB和VOPL. 在多媒体接口框图中可以看到,RK33 ...
- Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)
本篇文章是对Android中的Log进行了详细的分析介绍,需要的朋友参考下 在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一 ...
- DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)
DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...
- 《策略驱动型数据中心——ACI技术详解》一1.3 数据中心设计
本节书摘来自异步社区<策略驱动型数据中心--ACI技术详解>一书中的第1章,第1.3节,作者[美]Lucien Avramov [意]Maurizio Portolani,更多章节内容可以 ...
- 《策略驱动型数据中心——ACI技术详解》——1.3 数据中心设计
本节书摘来自异步社区<策略驱动型数据中心--ACI技术详解>一书中的第1章,第1.3节,作者: [美]Lucien Avramov [意]Maurizio Portolani 更多章节内容 ...
- android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...
一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...
- mysqlsum绝对值_MySQL_MySQL笔记之数学函数详解,绝对值函数ABS(x)和圆周率函数P - phpStudy...
MySQL笔记之数学函数详解 绝对值函数ABS(x)和圆周率函数PI() mysql> SELECT ABS(0.5), ABS(-0.5), PI(); +----------+------- ...
- java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解
Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...
- 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解
二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...
最新文章
- 揭秘美国空军如何用AI技术提升“战斗力”
- c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
- 摩托车计算机辅助设计,摩托车消声器消声特性及计算机辅助设计研究
- C# webbrowser 代理
- Ubuntu开发环境搭建
- 第 2 章 MybatisPlus 通用 CRUD
- Google Code Review代码审查标准
- Linux下编译安装redis,详细教程
- 创业者该如何给员工画饼、圆饼?
- 2017第25届春季中西部(重庆)医疗器械展览会会刊(参展商名录)
- 集合体系结构、Collection集合概述及常用方法(附迭代器遍历对象实例)、List(附子类LinkedList、ArrayList特点)、ListIterator、并发修改异常、增强for
- 清华社英语在线自动教程python版
- ubuntu安装gef,pwndbg,peda
- php 监听redis,php监听redis key失效触发回调事件_后端开发
- Mac Office 怎么设置单面打印
- 【EE308FZ Lab2-2】An Amazing Android App for Bobing Game
- Mac 安装minikube Error: No available formula with the name “minikube“
- 什么是程序员的核心竞争力?
- win10重新安装ie
- 建仓价 持仓价 平仓价
热门文章
- Baltimore System of Classifications of Viruses
- C语言之“先有的鸡还是先有的蛋”浅谈
- Linux基础知识------账号和权限管理
- 请编程序将“China“译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母
- UVA11584划分回文串
- 蓝桥杯算法训练-隐匿的刺客
- 开源图像数据集管理工具fiftyone使用
- mocha java mv_代码覆盖Mocha
- 京东登录页面(静态页面)
- LIO-SLAM分析