[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private unsafe static extern uint CreateThread(
uint* lpThreadAttributes,
uint dwStackSize,
ThreadStart lpStartAddress,
uint* lpParameter,
uint dwCreationFlags,
out uint lpThreadId);
[DllImport("kernel32", CharSet = CharSet.Ansi)]
public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress,
IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
[DllImport("kernel32.dll")]
def CreateThread(lpThreadAttributes as int, dwStackSize as int, lpStartAddress as IntPtr, param as int, dwCreationFlags as int, ref lpThreadId as uint) as IntPtr:
pass
None.
public delegate void StartThread();
unsafe uint StartThread(StartThread ThreadFunc, int StackSize)
{
uint a = 0;
uint* lpThrAtt = &a;
uint i = 0;
uint* lpParam = &i;
uint lpThreadID = 0;
uint dwHandle = CreateThread(null, (uint)StackSize, ThreadFunc, lpParam, 0, out lpThreadID);
if (dwHandle == 0) throw new Exception("Unable to create thread!");
return dwHandle;
}
Please add some!
VB.Net Signature
' Note: This declaration of CreateThread does not allow you to pass
' thread attributes. This is the CreateThread that should be used most
' often because the parameter for the thread function is passed by
' reference.
Public Declare Function CreateThread Lib "kernel32" _
(ByVal lpThreadAttributes As Integer, _
ByVal dwStackSize As Integer, _
ByVal lpStartAddress As DaThreadFuncDelegate, _
ByRef lpParameter As PARAM_TYPE, _
ByVal dwCreationFlags As Integer, _
ByRef lpThreadId As Integer) As Integer
' If you only are passing a single variable type like an integer or
' string as the thread parameter, use this version of CreateThread.
' Note that I set the lpParameter type to Integer.
Public Declare Function CreateThread#_ByValParam Lib "kernel32" Alias "CreateThread" _
(ByVal lpThreadAttributes As Integer, _
ByVal dwStackSize As Integer, _
ByVal lpStartAddress As DaThreadSubDelegate, _
ByVal lpParameter As Integer, _
ByVal dwCreationFlags As Integer, _
ByRef lpThreadId As Integer) As Integer
[DllImport("kernel32.dll")]
static extern IntPtr CreateThread([In] ref SECURITY_ATTRIBUTES
SecurityAttributes, uint StackSize, System.Threading.ThreadStart StartFunction,
IntPtr ThreadParameter, uint CreationFlags, out uint ThreadId);
SECURITY_ATTRIBUTES
Private Declare PtrSafe Function CreateThread Lib "KERNEL32" _
(ByVal SecurityAttributes As Long, ByVal StackSize As Long, ByVal StartFunction As LongPtr, _
ThreadParameter As LongPtr, ByVal CreateFlags As Long, ByRef ThreadId As Long) As LongPtr
addr = VirtualAlloc(0, UBound(buf), &H3000, &H40)
For counter = LBound(buf) To UBound(buf)
Data = buf(counter)
res = MoveMemory(addr + counter, Data, 1)
Next counter
res = CreateThread(0, 0, addr, 0, 0, 0)
None.
Please add some!
CreateThread(0,0,$addr,0,0,0);
Try System.Threading.Thread.Start. It doesn't give you all the control of directly calling CreateThread, (such as specifing the flags), but it will get you a vanilla thread to spin up.