// DRVICON.cpp : DLL アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

BOOL APIENTRY DllMain( HANDLE, DWORD, LPVOID )
{
    return TRUE;
}

static int args_typecheck( struct ARGS *args, char *types ) // 引数のチェック
{
	struct ARGS *p;

	p = args;

	if (p == NULL) {
		if (types == NULL || types[0] == 0)
			return 1; // OK
		else
			return 0; // NG
	}

	do {
		switch ( p->type ) {
			case UFCT_ARG_INT:
				if (*types != 'i')
					return 0; // NG
				break;

			case UFCT_ARG_STRING:
				if (*types != 's')
					return 0; // NG
				break;

			case UFCT_ARG_INTS:
				if (*types != 'a')
					return 0; // NG
				break;

			case UFCT_ARG_STRINGS:
				if (*types != 'r')
					return 0; // NG
				break;
		}
		
		types++;
	} while( (p = p->next) != NULL );

	if ( *types == 0 ) // argsが終端に達したとき、typeも終端に達したか?
		return 1; // OK
	else
		return 0; // NG
}

DllExport UINT isDrive( HWND hWnd, struct ARGS *args )
{
	char newcd[4] = "?:\\";

	if ( args_typecheck( args, "i" ) ) {
		// ARG1.integer - drive A=0, B=1, C=1... 
		// ドライブが存在していて、ハードディスク・リムーバブル(FDなど)・RAMディスク・
		// CD-ROM等・リモートなら1を返す

		newcd[0] = 'A' + ARG1.integer;
		switch ( GetDriveType( newcd ) ) {
			case DRIVE_REMOVABLE:
			case DRIVE_FIXED:
			case DRIVE_REMOTE:
			case DRIVE_RAMDISK:
			case DRIVE_CDROM:
				return 1;
		}
	}

	return 0;
}
