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表详解相关推荐

  1. 【Linux驱动开发】Linux设备树详解

    目录 一.设备树基础 1.概念 2.文件格式 3.编译工具 二.DTS语法 1..dtsi 头文件 2. 设备节点 3.标准属性 4.compatible 属性详解 5.修改设备树文件,增加或修改节点 ...

  2. RK3399驱动开发 | 08 - RK3399显示系统详解(基于RK SDK Linux 4.4.194内核)

    一.RK3399的显示系统 RK3399有两个视频显示控制器(VOP,Video Output Processor),支持不同的分辨率,分别为VOPB和VOPL. 在多媒体接口框图中可以看到,RK33 ...

  3. Android开发笔记之:Log图文详解(Log.v,Log.d,Log.i,Log.w,Log.e)

    本篇文章是对Android中的Log进行了详细的分析介绍,需要的朋友参考下 在Android群里,经常会有人问我,Android Log是怎么用的,今天我就把从网上以及SDK里东拼西凑过来,让大家先一 ...

  4. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)

    DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...

  5. 《策略驱动型数据中心——ACI技术详解》一1.3 数据中心设计

    本节书摘来自异步社区<策略驱动型数据中心--ACI技术详解>一书中的第1章,第1.3节,作者[美]Lucien Avramov [意]Maurizio Portolani,更多章节内容可以 ...

  6. 《策略驱动型数据中心——ACI技术详解》——1.3 数据中心设计

    本节书摘来自异步社区<策略驱动型数据中心--ACI技术详解>一书中的第1章,第1.3节,作者: [美]Lucien Avramov [意]Maurizio Portolani 更多章节内容 ...

  7. android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...

  8. mysqlsum绝对值_MySQL_MySQL笔记之数学函数详解,绝对值函数ABS(x)和圆周率函数P - phpStudy...

    MySQL笔记之数学函数详解 绝对值函数ABS(x)和圆周率函数PI() mysql> SELECT ABS(0.5), ABS(-0.5), PI(); +----------+------- ...

  9. java 检查bytebuf长度_Java学习笔记16-Netty缓冲区ByteBuf详解

    Java学习笔记16-Netty缓冲区ByteBuf详解 Netty自己的ByteBuf ByteBuf是为解决ByteBuffer的问题和满足网络应用程序开发人员的日常需求而设计的. JDK Byt ...

  10. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

最新文章

  1. 揭秘美国空军如何用AI技术提升“战斗力”
  2. c#如何使用反射去创建一个委托_【自学C#】|| 笔记 37 创建线程
  3. 摩托车计算机辅助设计,摩托车消声器消声特性及计算机辅助设计研究
  4. C# webbrowser 代理
  5. Ubuntu开发环境搭建
  6. 第 2 章 MybatisPlus 通用 CRUD
  7. Google Code Review代码审查标准
  8. Linux下编译安装redis,详细教程
  9. 创业者该如何给员工画饼、圆饼?
  10. 2017第25届春季中西部(重庆)医疗器械展览会会刊(参展商名录)
  11. 集合体系结构、Collection集合概述及常用方法(附迭代器遍历对象实例)、List(附子类LinkedList、ArrayList特点)、ListIterator、并发修改异常、增强for
  12. 清华社英语在线自动教程python版
  13. ubuntu安装gef,pwndbg,peda
  14. php 监听redis,php监听redis key失效触发回调事件_后端开发
  15. Mac Office 怎么设置单面打印
  16. 【EE308FZ Lab2-2】An Amazing Android App for Bobing Game
  17. Mac 安装minikube Error: No available formula with the name “minikube“
  18. 什么是程序员的核心竞争力?
  19. win10重新安装ie
  20. 建仓价 持仓价 平仓价

热门文章

  1. Baltimore System of Classifications of Viruses
  2. C语言之“先有的鸡还是先有的蛋”浅谈
  3. Linux基础知识------账号和权限管理
  4. 请编程序将“China“译成密码,密码规律是:用原来的字母后面第4个字母代替原来的字母
  5. UVA11584划分回文串
  6. 蓝桥杯算法训练-隐匿的刺客
  7. 开源图像数据集管理工具fiftyone使用
  8. mocha java mv_代码覆盖Mocha
  9. 京东登录页面(静态页面)
  10. LIO-SLAM分析