Среда С++ от Borland и вызовы WinAPI

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 1 окт 2008.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Плз обьясните чайнику в чем разница работы с WinAPI компиляторов борланда и майкрософсткого вижуал студио.Вот к примеру такой код
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. typedef LONG KPRIORITY;
    5. typedef UINT NTSTATUS;
    6. typedef enum _SYSTEMINFOCLASS
    7. {
    8. SystemBasicInformation, // 0x002C
    9. SystemProcessorInformation, // 0x000C
    10. SystemPerformanceInformation, // 0x0138
    11. SystemTimeInformation, // 0x0020
    12. SystemPathInformation, // not implemented
    13. SystemProcessInformation, // 0x00C8+ per process
    14. SystemCallInformation, // 0x0018 + (n * 0x0004)
    15. SystemConfigurationInformation, // 0x0018
    16. SystemProcessorCounters, // 0x0030 per cpu
    17. SystemGlobalFlag, // 0x0004 (fails if size != 4)
    18. SystemCallTimeInformation, // not implemented
    19. SystemModuleInformation, // 0x0004 + (n * 0x011C)
    20. SystemLockInformation, // 0x0004 + (n * 0x0024)
    21. SystemStackTraceInformation, // not implemented
    22. SystemPagedPoolInformation, // checked build only
    23. SystemNonPagedPoolInformation, // checked build only
    24. SystemHandleInformation, // 0x0004 + (n * 0x0010)
    25. SystemObjectTypeInformation, // 0x0038+ + (n * 0x0030+)
    26. SystemPageFileInformation, // 0x0018+ per page file
    27. SystemVdmInstemulInformation, // 0x0088
    28. SystemVdmBopInformation, // invalid info class
    29. SystemCacheInformation, // 0x0024
    30. SystemPoolTagInformation, // 0x0004 + (n * 0x001C)
    31. SystemInterruptInformation, // 0x0000, or 0x0018 per cpu
    32. SystemDpcInformation, // 0x0014
    33. SystemFullMemoryInformation, // checked build only
    34. SystemLoadDriver, // 0x0018, set mode only
    35. SystemUnloadDriver, // 0x0004, set mode only
    36. SystemTimeAdjustmentInformation, // 0x000C, 0x0008 writeable
    37. SystemSummaryMemoryInformation, // checked build only
    38. SystemNextEventIdInformation, // checked build only
    39. SystemEventIdsInformation, // checked build only
    40. SystemCrashDumpInformation, // 0x0004
    41. SystemExceptionInformation, // 0x0010
    42. SystemCrashDumpStateInformation, // 0x0004
    43. SystemDebuggerInformation, // 0x0002
    44. SystemContextSwitchInformation, // 0x0030
    45. SystemRegistryQuotaInformation, // 0x000C
    46. SystemAddDriver, // 0x0008, set mode only
    47. SystemPrioritySeparationInformation,// 0x0004, set mode only
    48. SystemPlugPlayBusInformation, // not implemented
    49. SystemDockInformation, // not implemented
    50. SystemPowerInfo, // 0x0060 (XP only!)
    51. SystemProcessorSpeedInformation, // 0x000C (XP only!)
    52. SystemTimeZoneInformation, // 0x00AC
    53. SystemLookasideInformation, // n * 0x0020
    54. SystemSetTimeSlipEvent,
    55. SystemCreateSession, // set mode only
    56. SystemDeleteSession, // set mode only
    57. SystemInvalidInfoClass1, // invalid info class
    58. SystemRangeStartInformation, // 0x0004 (fails if size != 4)
    59. SystemVerifierInformation,
    60. SystemAddVerifier,
    61. SystemSessionProcessesInformation, // checked build only
    62. MaxSystemInfoClass
    63. } SYSTEMINFOCLASS, *PSYSTEMINFOCLASS;
    64.  
    65. typedef enum
    66. {
    67. StateInitialized,
    68. StateReady,
    69. StateRunning,
    70. StateStandby,
    71. StateTerminated,
    72. StateWait,
    73. StateTransition,
    74. StateUnknown
    75. } THREAD_STATE;
    76.  
    77. typedef enum _KWAIT_REASON
    78. {
    79. Executive,
    80. FreePage,
    81. PageIn,
    82. PoolAllocation,
    83. DelayExecution,
    84. Suspended,
    85. UserRequest,
    86. WrExecutive,
    87. WrFreePage,
    88. WrPageIn,
    89. WrPoolAllocation,
    90. WrDelayExecution,
    91. WrSuspended,
    92. WrUserRequest,
    93. WrEventPair,
    94. WrQueue,
    95. WrLpcReceive,
    96. WrLpcReply,
    97. WrVirtualMemory,
    98. WrPageOut,
    99. WrRendezvous,
    100. Spare2,
    101. Spare3,
    102. Spare4,
    103. Spare5,
    104. Spare6,
    105. WrKernel,
    106. MaximumWaitReason
    107. } KWAIT_REASON, *PKWAIT_REASON;
    108.  
    109. typedef struct _CLIENT_ID
    110. {
    111. HANDLE UniqueProcess;
    112. HANDLE UniqueThread;
    113. } CLIENT_ID, *PCLIENT_ID;
    114.  
    115. typedef struct _UNICODE_STRING
    116. {
    117. USHORT Length;
    118. USHORT MaximumLength;
    119. PWSTR Buffer;
    120. } UNICODE_STRING, *PUNICODE_STRING;
    121.  
    122. typedef struct _SYSTEM_THREAD
    123. {
    124. LARGE_INTEGER liKernelTime; // 100 nsec units
    125. LARGE_INTEGER liUserTime; // 100 nsec units
    126. LARGE_INTEGER liCreateTime; // relative to 01-01-1601
    127. ULONG WaitTime; // ticks
    128. PVOID pStartAddress; // EIP
    129. CLIENT_ID Cid; // process/thread ids
    130. KPRIORITY Priority;
    131. KPRIORITY BasePriority;
    132. ULONG ContextSwitches;
    133. THREAD_STATE ThreadState;
    134. KWAIT_REASON WaitReason;
    135. // DWORD dwUnknown2; // maybe it not exists !!!
    136. } SYSTEM_THREAD, *PSYSTEM_THREAD;
    137.  
    138. typedef struct _VM_COUNTERS
    139. {
    140. ULONG uPeakVirtualSize;
    141. ULONG uVirtualSize;
    142. ULONG uPageFaultCount;
    143. ULONG uPeakWorkingSetSize;
    144. ULONG uWorkingSetSize;
    145. ULONG uQuotaPeakPagedPoolUsage;
    146. ULONG uQuotaPagedPoolUsage;
    147. ULONG uQuotaPeakNonPagedPoolUsage;
    148. ULONG uQuotaNonPagedPoolUsage;
    149. ULONG uPagefileUsage;
    150. ULONG uPeakPagefileUsage;
    151. } VM_COUNTERS, *PVM_COUNTERS;
    152.  
    153. typedef struct _IOCOUNTERS
    154. {
    155. ULONG uReadOperationCount;
    156. ULONG uWriteOperationCount;
    157. ULONG uOtherOperationCount;
    158. LARGE_INTEGER liReadTransferCount;
    159. LARGE_INTEGER liWriteTransferCount;
    160. LARGE_INTEGER liOtherTransferCount;
    161. } IOCOUNTERS, *PIOCOUNTERS;
    162.  
    163. typedef struct _SYSTEM_PROCESS_INFORMATION
    164. {
    165. ULONG uNext; // relative offset
    166. ULONG uThreadCount;
    167. LARGE_INTEGER liUnknown1;
    168. LARGE_INTEGER liUnknown2;
    169. LARGE_INTEGER liUnknown3;
    170. LARGE_INTEGER liCreateTime; // relative to 01-01-1601
    171. LARGE_INTEGER liUserTime; // 100 nsec units
    172. LARGE_INTEGER liKernelTime; // 100 nsec units
    173. UNICODE_STRING usName;
    174. KPRIORITY BasePriority;
    175. ULONG uUniqueProcessId;
    176. ULONG uInheritedFromUniqueProcessId;
    177. ULONG uHandleCount;
    178. ULONG uSessionId; // W2K Only!
    179. DWORD dwUnknown5;
    180. VM_COUNTERS VmCounters;
    181. ULONG uCommitCharge; // bytes
    182. SYSTEM_THREAD aST[];
    183. } SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;
    184.  
    185. typedef NTSTATUS (NTAPI *PZwQuerySystemInformation)(
    186. SYSTEMINFOCLASS SystemInformationClass,
    187. PVOID pSystemInformation,
    188. ULONG uSystemInformationLength,
    189. PULONG puReturnLength
    190. );
    191.  
    192. int main(int argc, char** argv)
    193. {
    194.     PZwQuerySystemInformation ZwQuerySystemInformation;
    195.     PSYSTEM_PROCESS_INFORMATION SPI=NULL;
    196.     ULONG memlen,bw;
    197.     char PrcName[1024];
    198.    
    199.     ZwQuerySystemInformation=GetProcAddress(GetModuleH  andle("ntdll.dll"),"ZwQuerySystemInformation");
    200.     if(!ZwQuerySystemInformation)return -1;
    201.    
    202.     printf("PID\tThreads\t\tName\n\n");;
    203.    
    204.     ZwQuerySystemInformation(SystemProcessInformation,  SPI,0,&memlen);
    205.     SPI=VirtualAlloc(NULL,memlen,MEM_COMMIT,PAGE_READW  RITE);
    206.     if(!ZwQuerySystemInformation(SystemProcessInformat  ion,SPI,memlen,&bw))
    207.         while(SPI->uNext>0)
    208.         {
    209.             SPI=(PVOID)(SPI->uNext+(ULONG)SPI);
    210.             if((SPI->usName.Length / 2)>=sizeof(PrcName)-1)continue;
    211.             wcstombs(PrcName,SPI->usName.Buffer,SPI->usName.Length);
    212.             printf("%u\t%u\t\t%s\n",SPI->uUniqueProcessId,SPI->uThreadCount,PrcName);  
    213.         }
    214.  
    215.     VirtualFree(SPI,memlen,MEM_DECOMMIT);
    216.     return 0;
    217. }
    работает только на майкрософстком кмпиляторе.А у борланда на этой строке
    Код (Text):
    1. ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    Вылазит такая ругань
    Код (Text):
    1. [C++ Error] Unit1.h(404): E2034 Cannot convert 'int (__stdcall *)()' to 'unsigned int (__stdcall *)(_SYSTEMINFOCLASS,void *,unsigned long,unsigned long *)'
     
  2. inviZ

    inviZ Сергей

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    92
    Адрес:
    Хабаровск
    Это на каком, на VC6, что ли? Эта старая рухлядь не соответствует стандарту, даже его первой версии от 1998 года.
    Точно могу сказать, даже не проверяя, что такой код не скомпилится в VS2005/2008.

    Используй приведение типов:
    Код (Text):
    1. ZwQuerySystemInformation = (PZwQuerySystemInformation) GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    P.S.
    BTW, твой код вполне компилируемый, если его рассматривать как код на языке C, а не C++.
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ну под борландом этот код после таких изменений
    Код (Text):
    1. ....................
    2. (int(__stdcall*)())ZwQuerySystemInformation=GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwQuerySystemInformation");
    3. ....................
    4. (void*)SPI=VirtualAlloc(NULL,memlen,MEM_COMMIT,PAGE_READWRITE);
    5. ....................
    6. (void*)SPI=(PVOID)(SPI->uNext+(ULONG)SPI);
    заработал.
    ЗЫ:а с какой стуктуры можно выдрать имя пользователя от которого запущен процесс?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    _nic
    Это знает винлогон, для вызывающего потока это advapi32.GetUserName(), там запрос к винлогон через порт "\LsaAuthenticationPort". Можно посмотреть сервисы этого порта, хотя должна быть соответствующая апи.
    [тьфу, не винлогон а lsass)]
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    пробую так
    Код (Text):
    1. char szUser[1024];DWORD pcchU,pcchD;
    2. char szDomain[1024];
    3. HANDLE       hToken   = NULL;
    4. PTOKEN_USER  ptiUser  = NULL;
    5. DWORD        cbti     = 0;
    6. SID_NAME_USE snu;
    7. .................
    8. SetLastError(0);
    9. HANDLE h=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,SPI->uUniqueProcessId);
    10. OpenProcessToken(h,TOKEN_QUERY,&hToken);ShowMessage(GetLastError());
    11. GetTokenInformation(hToken, TokenUser, NULL, 0, &cbti);
    12. ptiUser = (PTOKEN_USER)HeapAlloc(GetProcessHeap(),0,cbti);
    13. GetTokenInformation(hToken, TokenUser, ptiUser, cbti, &cbti);
    14. LookupAccountSid(NULL,ptiUser->User.Sid,szUser,&pcchU,szDomain,&pcchD,&snu);
    15. ....................
    Неработает :dntknw: Получаю код ошибки "5" тоесть "ERROR_ACCESS_DENIED" .Чего может нехватать??