CreateThread (kernel32)
Last changed: -197.211.63.30

.

Warning: All signatures on this page are wrong as of 2014-01-24. dwStackSize is SIZE_T and ThreadStart has the wrong delegate signature. It only works by coincidence.

Summary

C# Signature:

[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);

C# Signature:

  [DllImport("kernel32", CharSet = CharSet.Ansi)]
  public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress,
  IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);

Boo Signature:

[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

Notes:

None.

Sample Code:

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;
    }

Tips & Tricks:

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

C# Signature:

[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);

User-Defined Types:

SECURITY_ATTRIBUTES

VB Signature:

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

Sample Code:

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)

Notes:

None.

Tips & Tricks:

Please add some!

Sample Code:

CreateThread(0,0,$addr,0,0,0);

Alternative Managed API:

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.

Documentation