RTL,Register Transfer Level,直译为寄存器转换级,顾名思义,也就是在这个级别下,要描述各级寄存器(时序逻辑中的寄存器),以及寄存器之间的信号的是如何转换的(时序逻辑中的组合逻辑)。
通俗来讲,RTL代码不是在“写代码”,是在画电路结构。RTL代码需要“画”出输入输出端口,各级寄存器,寄存器之间的组合逻辑和前三者之间的连接。对于组合逻辑,只需要软件级描述,将其功能包装在“黑匣子”中即可,无需考虑其门级结构。
RtlInitUnicodeString
hkey = Scm_OpenKeyForService(SBIESVC, TRUE); if (! hkey) status = STATUS_UNSUCCESSFUL; else { RtlInitUnicodeString(&uni, L"SandboxedServices"); status = NtSetValueKey( hkey, &uni, 0, REG_MULTI_SZ, names2, len * sizeof(WCHAR)); NtClose(hkey); }
RtlFreeUnicodeString
_FX BOX *Box_Create(POOL *pool, const WCHAR *boxname, BOOLEAN init_paths) { BOX *box; UNICODE_STRING SidString; ULONG SessionId; NTSTATUS status = Process_GetSidStringAndSessionId( NtCurrentProcess(), NULL, &SidString, &SessionId); if (NT_SUCCESS(status)) { box = Box_CreateEx( pool, boxname, SidString.Buffer, SessionId, init_paths); RtlFreeUnicodeString(&SidString); } else { Log_Status_Ex(MSG_BOX_CREATE, 0x11, status, boxname); box = NULL; } return box; }
RtlCompareUnicodeString
_FX int Box_NlsStrCmp(const WCHAR *s1, const WCHAR *s2, ULONG len) { UNICODE_STRING u1, u2; u1.Length = u1.MaximumLength = u2.Length = u2.MaximumLength = (USHORT)(len * sizeof(WCHAR)); u1.Buffer = (WCHAR *)s1; u2.Buffer = (WCHAR *)s2; return RtlCompareUnicodeString(&u1, &u2, TRUE); }