RtInitializeProcThreadAttributeList
RtInitializeProcThreadAttributeList initializes a specified list of attributes for process and thread creation.
Syntax
BOOL WINAPI RtInitializeProcThreadAttributeList(
LPPROC_THREAD_ATTRIBUTE_LIST lpAttributeList,
DWORD dwAttributeCount,
DWORD dwFlags,
PSIZE_T lpSize
);
Parameters
lpAttributeList
The attribute list. This parameter can be NULL to determine the buffer size required to support the specified number of attributes.
dwAttributeCount
The count of attributes to be added to the list.
dwFlags
This parameter is reserved and must be zero.
lpSize
If lpAttributeList is not NULL, this parameter specifies the size in bytes of the lpAttributeList buffer on input. On output, this parameter receives the size in bytes of the initialized attribute list.
If lpAttributeList is NULL, this parameter receives the required buffer size in bytes.
Return Value
If the function succeeds, it returns a non-zero value. If the function fails, it returns 0 (zero). For extended error information, call GetLastError.
Remarks
First, call this function with the dwAttributeCount parameter set to the maximum number of attributes you will be using, and set lpAttributeList to NULL. The function returns the required buffer size in bytes in the lpSize parameter. Allocate enough space for the data in the lpAttributeList buffer and call the function again to initialize the buffer.
Note: This initial call will return an error. This is expected behavior.
To add attributes to the list, call the RtUpdateProcThreadAttribute function. To specify these attributes when creating a process, specify EXTENDED_STARTUPINFO_PRESENT in the dwCreationFlag parameter and a STARTUPINFOEX structure in the lpStartupInfo parameter. Note that you can specify the same STARTUPINFOEX structure to multiple child processes.
When you have finished using the list, call the RtDeleteProcThreadAttributeList function.
Requirements
Minimum supported version | Header | Library |
---|---|---|
eRTOS 1.0 SDK |
Rtapi.h | rtkrnl.lib |
Example
void
_cdecl
wmain(
int argc,
wchar_t **argv,
wchar_t **envp
)
{
STARTUPINFOEX startupInfoEx = { 0 };
PROCESS_INFORMATION processInformation = { 0 };
SIZE_T attributeListSize = 0;
ULONG idealProcessor = RtGetCurrentProcessorNumber();
BOOL bRetVal = FALSE;
startupInfoEx.StartupInfo.cb = sizeof(STARTUPINFOEX);
//
//Request the size of the opaque attribute list for one attribute.
//
if (!RtInitializeProcThreadAttributeList(NULL, 1, 0, &procAttributeSize))
{
error = GetLastError();
if (error != 122)
{
RtPrintf("RtInitializeProcThreadAttributeListBasicTest FAIL: initial RtInitializeProcThreadAttributeList failed with incorrect error, error = %d\n", error);
nErrors++;
return false;
}
}
else
{
RtPrintf("RtInitializeProcThreadAttributeListBasicTest FAIL: initial RtInitializeProcThreadAttributeList succeed unexpectedly");
nErrors++;
return false;
}
//
//Allocate the proper amount of memory.
//
startupInfoEx.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)malloc(attributeListSize);
if ( !startupInfoEx.lpAttributeList )
{
RtPrintf("malloc failed.");
return;
}
//
//Initialize the opaque attribute list.
//
bRetVal = RtInitializeProcThreadAttributeList(startupInfoEx.lpAttributeList, 1, 0, &attributeListSize);
if ( !bRetVal )
{
free(startupInfoEx.lpAttributeList);
RtPrintf("RtInitializeProcThreadAttributeList failed to initialize the attribute list.");
return;
}
//
//Update the list with the extended attribute.
//
bRetVal = RtUpdateProcThreadAttribute(startupInfoEx.lpAttributeList,
0,
RT_PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR,
&idealProcessor,
sizeof(ULONG),
NULL,
NULL);
if ( !bRetVal )
{
free(startupInfoEx.lpAttributeList);
RtPrintf("RtUpdateProcThreadAttribute failed.");
return;
}
//
//Create the process.
//
bRetVal = RtCreateProcess(L"c:\\Example\\Example.ertos",
NULL,
NULL,
NULL,
FALSE,
EXTENDED_STARTUPINFO_PRESENT,
NULL,
NULL,
(LPSTARTUPINFO)&startupInfoEx,
&processInformation);
if ( !bRetVal )
{
free(startupInfoEx.lpAttributeList);
RtPrintf("RtCreateProcess failed to create process.");
return;
}
//
//Clean up internal opaque attribute list data.
//
RtDeleteProcThreadAttributeList(startupInfoEx.lpAttributeList);
free(startupInfoEx.lpAttributeList);
//
//Cleanup eRTOS handles.
//
RtCloseHandle(processInformation.hThread);
RtCloseHandle(processInformation.hProcess);
ExitProcess(0);
}
See Also