/*

  ccpu32.h
  Copyright(C) 1996-2012 INASOFT 矢吹拓也/Ayacy

  ccpu32.libを利用するためのヘッダファイル

*/

#ifndef MYLIB__ISCCPU32__
#define MYLIB__ISCCPU32__

#ifndef OWN__CCPU32__
#pragma comment(lib, "ccpu32.lib")
#pragma comment(lib, "Iphlpapi.lib")
#pragma comment(lib, "winmm.lib")
#endif /* OWN__CCPU32__ */

#ifdef __cplusplus

#ifndef LibExport
#define LibExport extern "C"
#endif  /* LibExport */

#else /* __cplusplus */

#ifndef LibExport
#define LibExport extern
#endif  /* LibExport */

#endif /* __cplusplus */

#define CCPU32_VERSIONNUMBER		52409
#define CCPU32_COPYRIGHT_YEAR		_T("2014")

LibExport HGLOBAL ccpu32_GetEnvironmentA( LPCSTR  client, BOOL englishflag );	// 環境をテキストにして返す/返却値をあとでGlobalFreeすること!!
LibExport HGLOBAL ccpu32_GetEnvironmentW( LPCWSTR client, BOOL englishflag );	// 環境をテキストにして返す/返却値をあとでGlobalFreeすること!!

#ifdef _UNICODE
#define ccpu32_GetEnvironment	ccpu32_GetEnvironmentW
#else  /* _UNICODE */
#define ccpu32_GetEnvironment	ccpu32_GetEnvironmentA
#endif /* _UNICODE */

LibExport int ccpu32_GetEnvironment2A( LPCSTR  client, LPSTR  buf, int bufsize, BOOL englishflag );	// 環境情報をbufに入れる(bufsizeの目安はWBUFSIZE)
LibExport int ccpu32_GetEnvironment2W( LPCWSTR client, LPWSTR buf, int bufsize, BOOL englishflag );	// 環境情報をbufに入れる(bufsizeの目安はWBUFSIZE)

#ifdef _UNICODE
#define ccpu32_GetEnvironment2	ccpu32_GetEnvironment2W
#else  /* _UNICODE */
#define ccpu32_GetEnvironment2	ccpu32_GetEnvironment2A
#endif /* _UNICODE */

LibExport BOOL	  ccpu32_CopyToClipboardA( LPCSTR  client, BOOL englishflag );	// クリップボードに環境テキストをコピー
LibExport BOOL	  ccpu32_CopyToClipboardW( LPCWSTR client, BOOL englishflag );	// クリップボードに環境テキストをコピー

#ifdef _UNICODE
#define ccpu32_CopyToClipboard	ccpu32_CopyToClipboardW
#else  /* _UNICODE */
#define ccpu32_CopyToClipboard	ccpu32_CopyToClipboardA
#endif /* _UNICODE */

LibExport WORD    ccpu32_GetDllVersionA( LPCSTR  lpszDllName );	// lpszDllNameのバージョンを調べる
LibExport WORD    ccpu32_GetDllVersionW( LPCWSTR lpszDllName );	// lpszDllNameのバージョンを調べる

#ifdef _UNICODE
#define ccpu32_GetDllVersion	ccpu32_GetDllVersionW
#else  /* _UNICODE */
#define ccpu32_GetDllVersion	ccpu32_GetDllVersionA
#endif /* _UNICODE */

LibExport DWORD   ccpu32_GetVersion( VOID );		// CCPU32.DLL自身のバージョン番号を得る
													// 整数部×10000＋小数部×100＋内部リリースNo.
LibExport WORD    ccpu32_GetComCtl32Ver( VOID );	// Comctl32.dll のバージョンを得る
LibExport WORD    ccpu32_GetIEVer( VOID );		    // Internet Explorer のバージョンを得る
LibExport WORD    ccpu32_WinVer( VOID );		    // Windows のバージョンを得る(major*100 + minor)
LibExport DWORD   ccpu32_GetPlatform( VOID );	    // プラットフォームIDを得る(VER_PLATFORM_WIN32_WINDOWS(1):Win9x, VER_PLATFORM_WIN32_NT(2):WinNT)

#define ccpu32_isNT()	1							// 本バージョンはWindows XP以降でしか動作しないので、必ずNT系である

LibExport WORD    ccpu32_GetCpuid( VOID );			// CPUIDコードを得る
LibExport VOID    ccpu32_CpuidFunction(ULONG function, PULONG peax, PULONG pebx, PULONG pecx, PULONG pedx);
													// CPUID Function
LibExport ULONG   ccpu32_GetProcessorClock( VOID );	// クロックを返す(旧互換)
LibExport ULONG   ccpu32_GetCPUClock( BYTE mode );  // CPUクロック計測[単位は10kHz](0:高分解能パフォーマンスカウンタ 1:マルチメディアタイマ 2:GetTickCount 3:Sleep)
LibExport BOOL    ccpu32_CheckRDTSC( VOID );		// RDTSC命令が利用可能かチェック
LibExport BOOL    ccpu32_CheckUseCPUID( VOID );	    // CPUID命令が利用可能かチェック
LibExport BOOL    ccpu32_IsWow64Process( VOID );    // WOW64下の32bitプロセスとして実行している場合、TRUEを返す。そうでない場合はFALSEを返す。

LibExport void ccpu32_UnixTimeToFileTime(time_t t, LPFILETIME pft); // time_tをFILETIMEに変換する

typedef void(WINAPI *CCPUDLG_CALL)(HWND);

typedef struct {
	BOOL modeJP;
	int numIconRes;
	HINSTANCE hInst;
	HWND hWnd;
	LPCWSTR pszTitle;
	LPCWSTR pszUrl;
	LPCWSTR pszEmail;
	LPCWSTR pszKifuURL;
	LPCWSTR pszInformation;
	CCPUDLG_CALL ccpudlg_call;
	LPCWSTR pszFeedbackURL;
} C32ABOUTBOXW, *PC32ABOUTBOXW;

typedef struct {
	BOOL modeJP;
	int numIconRes;
	HINSTANCE hInst;
	HWND hWnd;
	LPCSTR pszTitle;
	LPCSTR pszUrl;
	LPCSTR pszEmail;
	LPCSTR pszKifuURL;
	LPCSTR pszInformation;
	CCPUDLG_CALL ccpudlg_call;
	LPCSTR pszFeedbackURL;
} C32ABOUTBOXA, *PC32ABOUTBOXA;

LibExport int ccpu32_ShowAboutBoxW( PC32ABOUTBOXW pc32ab );
LibExport int ccpu32_ShowAboutBoxA( PC32ABOUTBOXA pc32ab );

#ifdef _UNICODE
#define ccpu32_ShowAboutBox		ccpu32_ShowAboutBoxW
#define PC32ABOUTBOX			PC32ABOUTBOXW
#define C32ABOUTBOX				C32ABOUTBOXW
#else  /* _UNICODE */
#define ccpu32_ShowAboutBox		ccpu32_ShowAboutBoxA
#define PC32ABOUTBOX			PC32ABOUTBOXA
#define C32ABOUTBOX				C32ABOUTBOXA
#endif /* _UNICODE */

// HDD/SSD判別用

typedef struct {
	DWORD DeviceType;
	ULONG nDevice;
	ULONG nPartitionNumber;
	USHORT word217;
} C32HDDINFO;

LibExport BOOL c32getHddInfo(char cDrive, C32HDDINFO *pc32hddinfo);

// CD/DVD判別用

#define C32GCI_NONE			0			// 未判別
#define C32GCI_CD			-1			// CD類
#define C32GCI_DVD			-2			// DVD類

#define C32GCI_CDROM             0x08   // CD-ROM Read only Compact Disc capable
#define C32GCI_CDR               0x09   // CD-R Write once Compact Disc capable
#define C32GCI_CDRW              0x0A   // CD-RW Re-writable Compact Disc capable
#define C32GCI_DVDROM            0x10   // DVD-ROM Read only DVD
#define C32GCI_DVDR              0x11   // DVD-R Sequential Recording Write once DVD using Sequential recording
#define C32GCI_DVDRAM            0x12   // DVD-RAM Re-writable DVD
#define C32GCI_DVDMinusRWOvr     0x13   // DVD-RW Restricted Overwrite Re-recordable DVD using Restricted Overwrite
#define C32GCI_DVDMinusRWSeq     0x14   // Sequential recording Re-recordable DVD using Sequential recording
#define C32GCI_DVDMinusRDualSeq  0x15   // DVD-R Dual Layer Sequential Recording Dual Layer DVD-R using Sequential recording
#define C32GCI_DVDMinusRDualJump 0x16   // DVD-R Dual Layer Jump Recording Dual Layer DVD-R using Layer Jump recording
#define C32GCI_DVDPlusRW         0x1A   // DVD+RW DVD+ReWritable
#define C32GCI_DVDPlusR          0x1B   // DVD+R DVD+Recordable
#define C32GCI_DVDPlusRWDual     0x2A   // Dual Layer DVD+Rewritable Dual Layer
#define C32GCI_DVDPlusRDual      0x2B   // DVD+R Dual Layer DVD+Recordable Dual Layer
#define C32GCI_BluRayRom         0x40   // BD-ROM Blu-ray Disc ROM
#define C32GCI_BluRayBDRSeq      0x41   // BD-R SRM Blu-ray Disc Recordable - Sequential Recording
#define C32GCI_BluRayRRM         0x42   // Blu-ray Disc Recordable - Random Recording Mode
#define C32GCI_BluRayRE          0x43   // BD-RE Blu-ray Disc Rewritable
#define C32GCI_HDDVDROM          0x50   // HD DVD-ROM Read-only HD DVD
#define C32GCI_HDDVDR            0x51   // HD DVD-R Write-once HD DVD
#define C32GCI_HDDVDRAM          0x52   // HD DVD-RAM Rewritable HD DVD

LibExport int c32getCdInfo(char cDrive);

#ifndef UBOUND
// 配列のサイズ計算
#define UBOUND(array) (sizeof(array)/sizeof(array[0]))
#endif /* UBOUND */

// ccpu32_GetEnvironmentWに入れるwbufのバッファサイズの目安（2006年時点での一般的な環境情報の長さの最大の約2倍）
#define WBUFSIZE	16384

// LibExport char *dout( const char *text ); // debug

#endif /* MYLIB__ISCCPU32__ */
